sql-server - transaction - set isolation to dirty read
Ámbitos de nivel de aislamiento de transacciones (7)
¿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.
Obviamente, el alcance comienza cuando usas 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.
De libros en línea
Solo se puede configurar una de las opciones de TRANSACTION ISOLATION LEVEL a la vez, y permanece establecida para esa conexión hasta que se modifique explícitamente. Esto se convierte en el comportamiento predeterminado a menos que se especifique una opción de optimización en el nivel de tabla en la cláusula FROM de la instrucción.
Desde MSDN
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.
Ejecute lo siguiente y compruébelo usted 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;
El nivel de aislamiento no retrocede con la transacción.
El nivel de aislamiento permanece actualizado incluso si llama a procedimientos y funciones.
Para obtener más información acerca de los niveles de aislamiento en SQL Server, incluidos los bloqueos y su impacto en la base de datos en detalle con ejemplos, consulte el siguiente enlace: http://www.sqllion.com/2009/07/transaction-isolation-levels-in-sql-server/
Tenga en cuenta que existe un problema con el alcance de TRANSACTION LEVELS y SqlServer 2012 o anterior cuando se utiliza la agrupación de conexiones ADO.NET de alto rendimiento, donde esto puede persistir durante el cierre de la conexión:
SQL Server: filtraciones de nivel de aislamiento a través de conexiones agrupadas
DBCC USEROPTIONS
mostrará el nivel de aislamiento actual, junto con todas las demás opciones de SET.