交易隔离级别范围

Sur*_*ish 40 t-sql sql-server sql-server-2005 isolation-level

SQL Server 2005中事务隔离级别的作用域规则是什么?我知道不同级别的含义,但不知道如何在手动运行的脚本之外正确应用它们.我找不到生产质量代码中实际使用的指南.

显然,当你使用这样的命令时,范围就开始了:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
Run Code Online (Sandbox Code Playgroud)

但它在哪里结束?如果我在存储过程中设置iso级别然后该proc调用另一个,嵌套的proc是否继承它?更好的是,如果我升级嵌套proc中的iso级别,它是否会进入调用proc?像BEGIN TRAN,ROLLBACK和COMMIT这样的事务命令会有什么不同吗?

当应用程序或代理程序作业调用存储过程时,隔离级别更改是否会以某种方式持续存在?我是否总是必须在每个过程结束时恢复默认的READ COMMITTED?

我会在不同的情况下测试它,但我不知道如何读取当前隔离级别设置的内容.

A-K*_*A-K 36

运行以下内容并亲自查看:

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;
Run Code Online (Sandbox Code Playgroud)

  • 所以看起来父proc不会受到子proc中iso级别更改的影响,但是子proc会将parent的iso级别作为默认值继承. (15认同)

And*_*zov 17

来自MSDN

如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL ,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别.例如,如果在批处理中设置REPEATABLE READ,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制权返回给批处理时,隔离级别设置将恢复为REPEATABLE READ.


小智 14

DBCC USEROPTIONS 将显示当前隔离级别以及所有其他SET选项.