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

显然,范围是在您使用以下命令时开始的:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

但是它在哪里结束?如果我在存储过程中设置了iso级别,然后该proc调用了另一个级别,则嵌套proc会继承吗?更好的是,如果我升级嵌套proc内部的iso级别,它将继续执行到调用proc中吗?像BEGIN TRAN,ROLLBACK和COMMIT这样的事务命令有什么区别吗?

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

我会在不同的情况下对其进行测试,但我不知道如何读取当前的隔离级别设置。

最佳答案

运行以下命令,自己看看:

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;

10-04 15:16