Qual è l'ambito dell'isolamento nelle transazioni nidificate in SQL Server?
-
03-07-2019 - |
Domanda
Considera il seguente 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
In breve, iniziamo una transazione e impostiamo il suo livello di isolamento su LEGGI IMPEGNATO
. Quindi eseguiamo alcuni SQL casuali e avviamo un'altra transazione nidificata. In questa transazione cambiamo il livello di isolamento in LEGGI UNCOMMITTED
. Commettiamo quindi quella transazione e torniamo all'altra.
Ora, suppongo che dopo il commit interno, il livello di isolamento ritorna su LEGGI IMPEGNATO
. È corretto?
Soluzione
Non penso sia corretto.
Fare riferimento alle osservazioni qui: Imposta transazione
Solo uno del livello di isolamento le opzioni possono essere impostate alla volta e rimane impostato per quella connessione fino al è stato esplicitamente modificato.
Altri suggerimenti
Tu [Bob Probst] hai ragione. È interessante notare che, secondo la documentazione che hai collegato:
Se si emette SET TRANSACTION ISOLATION LEVEL in una procedura memorizzata o in un trigger, quando l'oggetto restituisce il controllo il livello di isolamento viene ripristinato al livello in vigore quando l'oggetto è stato invocato. Ad esempio, se si imposta REPEATABLE READ in un batch e il batch chiama quindi una procedura memorizzata che imposta il livello di isolamento su SERIALIZZABILE, l'impostazione del livello di isolamento torna su REPEATABLE READ quando la procedura memorizzata restituisce il controllo al batch.
Quindi, la linea di fondo qui è che SET TRANSACTION ISOLATION LEVEL ha affinità di procedura , non affinità di transazione (come avevo pensato).
Impressionante!