交易隔离级别范围

时间:2009-06-25 19:01:06

标签: sql-server tsql sql-server-2005 isolation-level

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

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

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

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

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

6 个答案:

答案 0 :(得分: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;

答案 1 :(得分:16)

来自MSDN

  

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

答案 2 :(得分:14)

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

答案 3 :(得分:4)

来自在线图书

  

只有一个TRANSACTION ISOLATION   LEVEL选项可以一次设置,   它仍然为该连接设置   直到明确更改。这个   成为默认行为,除非   优化选项在   FROM子句中的表级别   声明。

答案 4 :(得分:2)

隔离级别不会随事务回滚。

即使您调用过程和函数,隔离级别也会保持最新状态。

答案 5 :(得分:0)

请注意,在使用高性能ADO.NET连接池时,TRANSACTION LEVELS和SqlServer 2012或更早版本的范围存在问题,这可能会在关闭连接时实际持续存在:

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