2009-06-25 22 views
36

¿Cuáles son las reglas de alcance para los niveles de aislamiento de transacciones en SQL Server 2005? Sé lo que significan los diferentes niveles, pero no cómo aplicarlos correctamente fuera de un script ejecutado manualmente. No puedo encontrar una guía para el uso práctico en el código de calidad de producción.Ámbitos de nivel de aislamiento de transacciones

Obviamente, el alcance comienza cuando se utiliza un comando como este:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

Pero ¿dónde termina? Si configuro el nivel iso en un procedimiento almacenado y luego ese proceso llama a otro, ¿el proceso anidado lo hereda? Aún mejor, si escalo el nivel iso dentro del proceso anidado, ¿volverá a funcionar en el proceso de llamada? ¿Los comandos de transacción como BEGIN TRAN, ROLLBACK y COMMIT hacen alguna diferencia?

Cuando una aplicación o un trabajo de agente llama a un proceso almacenado, ¿los cambios de nivel de aislamiento persisten de algún modo? ¿Siempre tengo que volver al valor predeterminado LEER COMPROMETIDO al final de cada proceso?

Lo probaría en diferentes situaciones, pero no sé cómo se define el nivel de aislamiento actual.

+0

El hecho de que el alcance de esto va más allá de la transacción actual (y, debido a la agrupación de conexiones, más allá de la "sesión" actual) puede quemarlo. Ver [esta publicación] (http://www.codeducky.org/mysterious-deadlocks-leaking-isolation-levels/) Escribí sobre el tema. – ChaseMedallion

Respuesta

36

Ejecutar la siguiente y ver por sí mismo:

CREATE PROCEDURE dbo.KeepsIsolation 
AS 
BEGIN 
PRINT 'Inside sproc that does not change isolation level'; 
DBCC USEROPTIONS; 
END 
GO 

CREATE PROCEDURE dbo.ChangesIsolation 
AS 
BEGIN 
PRINT 'Inside sproc that changes isolation level'; 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
DBCC USEROPTIONS; 
END 
GO 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
DBCC USEROPTIONS; 
EXEC dbo.KeepsIsolation; 
DBCC USEROPTIONS; 
EXEC dbo.ChangesIsolation; 
-- demonstrates that isolation level restored to REPEATABLE READ after exiting the procedure 
    DBCC USEROPTIONS; 
+14

Parece que el proceso primario no se ve afectado por los cambios en el nivel iso dentro del proceso hijo, pero el proceso hijo hereda el nivel iso de los padres como el predeterminado. – SurroundedByFish

2

El nivel de aislamiento no retrocede con la transacción.

El nivel de aislamiento permanece actualizado incluso si llama a procedimientos y funciones.

4

De los libros en línea de

Sólo una de las opciones de nivel de transacción AISLAMIENTO se puede ajustar a la vez, y Permanece establecido para esa conexión hasta que se cambie de manera explícita. Este se convierte en el comportamiento por defecto a no ser una opción optimización se especifica en el nivel de tabla en la cláusula FROM de el comunicado.

+6

Sin embargo, la respuesta aceptada demuestra que esto no es cierto: cambiar el nivel de AISLACIÓN dentro de un proceso almacenado no cambia el nivel para un proceso almacenado que realiza la llamada. O los documentos están equivocados o he entendido mal. – redcalx

+1

De acuerdo con el comentario anterior. Aunque aprecio la cita del comentario BOL, esto parece estar en desacuerdo con la respuesta aceptada. – snth

+2

En realidad es correcto. Tampoco está COMPLETO. Ahora, si ignora la excepción dada en la documentación (consulte la cita de Andrey), entonces - ah - sí, este es el tipo de mala respuesta que se publica. – TomTom

13

DBCC USEROPTIONS mostrará el nivel de aislamiento actual, junto con todas las demás opciones de SET.

14

de MSDN

Si emite conjunto de transacciones AISLAMIENTO dE NIVEL en una 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 establece REPEATABLE READ en un lote y el lote llama a un procedimiento almacenado que establece el nivel de aislamiento en SERIALIZABLE, la configuración de nivel de aislamiento revierte a REPEATABLE READ cuando el procedimiento almacenado devuelve el control al lote.

0

Tenga en cuenta que hay un problema con el alcance de niveles de transacción y SqlServer 2012 o antes, cuando se utiliza un alto rendimiento Pooling de conexión ADO.NET cuando en realidad esto puede persistir a través de cierre de la conexión:

SQL Server: Isolation level leaks across pooled connections

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/916b3d8a-c464-4ad5-8901-6f845a2a3447/sql-server-2014-reseting-isolation-level?forum=sqldatabaseengine

Cuestiones relacionadas