41

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

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

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

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

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

4

6 回答 6

37

运行以下命令并亲自查看:

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;
于 2009-06-25T20:09:02.707 回答
17

来自MSDN

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

于 2014-02-06T18:35:32.160 回答
14

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

于 2009-06-25T19:19:39.797 回答
4

从网上的书

一次只能设置一个 TRANSACTION ISOLATION LEVEL 选项,并且在显式更改之前一直为该连接设置。除非在语句的 FROM 子句中的表级别指定优化选项,否则这将成为默认行为。

于 2009-06-25T19:08:56.603 回答
2

隔离级别不随事务回滚。

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

于 2009-06-25T19:03:55.367 回答
0

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

SQL Server:跨池连接的隔离级别泄漏

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

于 2015-12-22T06:24:26.167 回答