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

显然,当您使用如下命令时,范围就开始了:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

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

当应用程序或代理作业调用存储过程时,隔离级别更改是否会以某种方式持续存在?我是否总是必须在每个过程结束时恢复为默认的 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;

其他提示

MSDN

  

如果您发出事务隔离级别设置的在存储过程中或   触发器,当对象返回控制的隔离级别的复位   到有效的水平,当对象被调用即可。例如,如果   您设置了一批可重复读取,然后批量调用存储   过程,将隔离级别设置为SERIALIZABLE,隔离   电平设置恢复到可重复读取时存储的过程   将控制返回到批料中。

DBCC USEROPTIONS将显示当前的隔离电平,与所有的其它SET选项。

从上线书籍

  

只有事务隔离的一个   LEVEL选项可以一次设定,   它保持设置为连接   直到被明确改变。这个   成为除非默认行为   优化选项在指定   在表级别从第   该语句。

隔离级别不与事务回滚。

隔离级别保持最新状态,即使你打电话到过程和函数。

请注意,当使用高性能 ADO.NET 连接池时,事务级别和 SqlServer 2012 或更早版本的范围存在问题,在连接关闭时,该问题实际上会持续存在:

SQL服务器:跨池连接的隔离级别泄漏

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top