Was ist der Umfang der Isolation in verschachtelten Transaktionen in SQL Server?
-
03-07-2019 - |
Frage
Betrachten Sie das folgende SQL:
BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ COMMITTED INSERT Bands ( Name ) SELECT 'Depeche Mode' UNION SELECT 'Arcade Fire' -- I've indented the inner transaction to make it clearer. BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM Bands COMMIT -- What is the isolation level right here? UPDATE Bands SET Name = 'Modest Mouse' WHERE Name = 'Oddest House' COMMIT
Insgesamt starten wir eine Transaktion und stellen Sie die Isolationsstufe auf READ COMMITTED
. Wir tun dann einige zufällige SQL und starten Sie eine andere, verschachtelte Transaktion. In dieser Transaktion ändern wir die Isolationsstufe READ UNCOMMITTED
. Wir verpflichten dann diese Transaktion und Rückkehr in die andere.
Nun, meine Vermutung ist, dass nach dem inneren verpflichten, die Isolationsstufe READ COMMITTED
zurückgibt. Ist das richtig?
Lösung
Ich glaube nicht, das ist richtig.
Beachten Sie die Bemerkungen hier: Set Transaktion
Nur eines der Isolationsstufe Optionen können zu einem Zeitpunkt festgelegt werden, und es bleibt für diese Verbindung gesetzt, bis es wird explizit geändert.
Andere Tipps
Sie [Bob Probst] korrekt sind. Interessanterweise nach dem Dokumentation verknüpft:
Wenn Sie Ausgabe Transaktionsisolationsstufe in einer Stored Procedure oder Trigger gesetzt, wenn das Objekt kehrt die Isolationsstufe steuern auf das Niveau in der Tat zurückgesetzt wird, wenn das Objekt aufgerufen wurde. wenn Sie WIEDERHOLBARE READ in einer Charge und der Ansatz dann ruft eine gespeicherte Prozedur zum Beispiel festgelegt, dass die Isolationsstufe auf SERIALIZABLE setzt, kehrt die Isolationsstufe Einstellung READ wiederholbar, wenn die gespeicherte Prozedur kehrt zum Batch-Steuerung.
So, hier ist das Endergebnis, dass SET TRANSACTION ISOLATION LEVEL hat Prozedur Affinität , nicht Transaktion Affinität (wie ich gedacht hatte).
Awesome!