3

Ich habe eine Reihe von Dienstprogramm-Prozeduren, die nur auf einige Bedingungen in der Datenbank überprüfen und ein Flag-Ergebnis zurückgeben. Diese Prozeduren werden mit READ UNCOMMITTED Isolationsstufe ausgeführt, die WITH NOLOCK entspricht.Ist es in Ordnung, wenn ich innerhalb einer gespeicherten Prozedur eine andere aufruft, die eine niedrigere Transaktionsisolationsstufe festlegt?

Ich habe auch komplexere Verfahren, die mit SERIALIZABLE Isolationsebene ausgeführt werden. Sie haben auch diese Art von Prüfungen in ihnen.

Also entschied ich mich, diese Prüfverfahren innerhalb dieser komplexen Prozeduren aufzurufen, anstatt den Prüfcode zu replizieren.

Grundsätzlich sieht es wie folgt aus:

CREATE PROCEDURE [dbo].[CheckSomething] 
AS 
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

    BEGIN TRANSACTION 

    -- Do checks 

    COMMIT TRANSACTION 

und

CREATE PROCEDURE [dbo].[DoSomethingImportant] 
AS 
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

    BEGIN TRANSACTION 

    EXECUTE [dbo].[CheckSomething] 

    -- Do some work 

    COMMIT TRANSACTION 

Wäre es okay, das zu tun? Wird die vorübergehend aktivierte niedrigere Isolationsstufe den Schutz auf höherer Ebene durchbrechen oder ist alles vollkommen sicher?

EDIT: Die Ausführung läuft reibungslos ohne Fehler.

Antwort

5

Es ist all here für SQL Server 2005. Ein Ausschnitt:

Wenn Sie eine Transaktion von einer Isolationsstufe zu einem anderen wechseln, Ressourcen , die nach der Änderung gelesen werden, sind nach geschütztem den Regeln der das neue Niveau. Ressourcen, die gelesen werden vor der Änderung weiterhin geschützt nach den Regeln von der vorherigen Ebene. Wenn beispielsweise eine Transaktion von READ COMMITTED in SERIALIZABLE geändert wird, werden die freigegebenen Sperren , die nach der Änderung erfasst wurden, jetzt bis zum Ende der -Transaktion gehalten.

Wenn Sie TRANSACTION ISOLATION LEVEL in einer Stored Procedure oder Auslöser-Set Problem, wenn das Objekt zurückgibt Steuerung der Isolationsstufe ist auf das Niveau in der Tat zurückgesetzt, wenn das Objekt aufgerufen wurde. Zum Beispiel, wenn Sie WIEDERHOLBARE READ in einer Charge eingestellt, und die Batch dann ruft eine gespeicherte Prozedur , die die Isolationsstufe auf SERIALIZABLE setzt die Isolationsstufe Einstellung READ wiederholbaren kehrt, wenn die gespeicherte Prozedur Steuerung kehrt zu der Stapel.

In diesem Beispiel:

  • Jede Isolationsstufe für den Umfang der gespeicherten proc
  • Ressourcen durch DoSomethingImportant bleiben unter SERIALIZABLE
  • Ressourcen, die von CheckSomething werden gelesen UNCOMMITTED verriegelt angelegt wird
+0

Danke für die Klarstellung, als ich dies in der Vergangenheit tat ich war außerhalb eines gespeicherten Proc, so dass das Verhalten war anders t –