事务隔离级别范围

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

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

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

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

我会在不同的情况下testing它,但我不知道如何读取当前的隔离级别。

运行以下内容并亲自查看:

 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

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

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

从书上线

一次只能设置一个TRANSACTION ISOLATION LEVEL(交易隔离级别)选项,并且在该连接被明确更改之前,它将保持为该连接设置。 这将成为默认行为,除非在语句的FROM子句中的表级别指定了优化选项。

隔离级别不会与事务一起回滚。

即使您调用程序和函数,隔离级别仍保持当前状态。

要了解更多有关SQL Server中的隔离级别的信息,包括locking及其对数据库的影响,请参考以下链接: http : //www.sqllion.com/2009/07/transaction-isolation-levels-in-sql -服务器/

请注意,当使用高性能的ADO.NET连接池时,在TRANSACTION LEVELS和SqlServer 2012或更低版本的作用域中存在一个问题,在连接closures的情况下,实际上它可能会持续存在:

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

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