-
20-08-2019 - |
题
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 或更早版本的范围存在问题,在连接关闭时,该问题实际上会持续存在: