sql-server - read - transacciones en sql server pdf
¿Cuál es el alcance del aislamiento en las transacciones anidadas en SQL Server? (2)
Considere el siguiente 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
En resumen, iniciamos una transacción y establecemos su nivel de aislamiento en READ COMMITTED
. Luego hacemos SQL aleatorio y comenzamos otra transacción anidada. En esta transacción, cambiamos el nivel de aislamiento para READ UNCOMMITTED
. Luego cometemos esa transacción y volvemos a la otra.
Ahora, supongo que después de la confirmación interna, el nivel de aislamiento vuelve a READ COMMITTED
. ¿Es esto correcto?
No creo que eso sea correcto
Consulte los comentarios aquí: Establecer transacción
Solo se puede establecer una de las opciones de nivel de aislamiento a la vez, y permanece establecida para esa conexión hasta que se modifique explícitamente.
Usted [Bob Probst] está en lo cierto. Curiosamente, de acuerdo con la documentación que vinculó:
Si emite SET TRANSACTION ISOLATION LEVEL en un procedimiento almacenado o disparador, cuando el objeto devuelve el control, el nivel de aislamiento se restablece al nivel vigente cuando se invoca el objeto. Por ejemplo, si configura REPEATABLE READ en un lote y el lote llama a un procedimiento almacenado que establece el nivel de aislamiento en SERIALIZABLE, la configuración del nivel de aislamiento vuelve a REPEATABLE READ cuando el procedimiento almacenado devuelve el control al lote.
Entonces, el resultado final aquí es que SET TRANSACTION ISOLATION LEVEL tiene afinidad de procedimiento , no afinidad de transacción (como yo había pensado).
¡Increíble!