Pregunta

¿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 adecuadamente 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 usa 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, ¿se volverá a llevar al 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, ¿persisten los cambios de nivel de aislamiento de alguna manera? ¿Siempre tengo que volver al valor predeterminado LEÍDO COMPROMETIDO al final de cada proceso?

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

¿Fue útil?

Solución

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;

Otros consejos

De 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 invocó el objeto . Por ejemplo, si   configura READATABLE READ en un lote, y el lote luego llama a un   procedimiento que establece el nivel de aislamiento en SERIALIZABLE, el aislamiento   la configuración de nivel vuelve a REPEATABLE READ cuando el procedimiento almacenado   devuelve el control al lote.

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

De libros en línea

  

Solo uno de los AISLAMIENTOS DE TRANSACCIÓN   Las opciones de NIVEL se pueden configurar a la vez,   y permanece establecido para esa conexión   hasta que se cambie explícitamente. Esta   se convierte en el comportamiento predeterminado a menos que un   la opción de optimización se especifica en   el nivel de la tabla en la cláusula FROM de   la declaración.

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

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

Tenga en cuenta que hay un problema con el alcance de los NIVELES DE TRANSACCIÓN 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: el nivel de aislamiento se filtra a través de conexiones agrupadas

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top