当前位置:  开发笔记 > 编程语言 > 正文

SQL Server中嵌套事务的隔离范围是什么?

如何解决《SQLServer中嵌套事务的隔离范围是什么?》经验,为你挑选了2个好方法。

考虑以下SQL:

BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

INSERT Bands
    (  Name  )
SELECT 'Depeche Mode'
UNION
SELECT 'Arcade Fire'

    -- I've indented the inner transaction to make it clearer.

    BEGIN TRAN
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT *
      FROM Bands

    COMMIT

-- What is the isolation level right here?

UPDATE Bands
   SET Name = 'Modest Mouse'
 WHERE Name = 'Oddest House'

COMMIT

总而言之,我们启动一个事务并将其隔离级别设置为READ COMMITTED.然后我们做一些随机SQL并启动另一个嵌套事务.在此事务中,我们将隔离级别更改为READ UNCOMMITTED.然后我们提交该事务并返回另一个事务.

现在,我的猜测是在内部提交之后,隔离级别返回READ COMMITTED.它是否正确?



1> Gregory Higl..:

你[Bob Probst]是正确的.有趣的是,根据您链接的文档:

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

所以,这里的底线是SET TRANSACTION ISOLATION LEVEL具有过程亲和力,而不是事务亲和力(正如我所想的那样).

真棒!


好吧,糟透了,哈哈!我的C#数据库API倾向于接受打开的连接对象,因此我可以调用多个函数,而无需每次都打开新连接.缺少"事务关联"意味着如果我从另一个调用一个数据库API方法,并且都使用事务,嵌套事务可能会改变调用者事务的事务隔离级别.绝对糟透了.WORKAROUND ...对于任何使用事务的C#方法,通过保存隔离级别(dbcc useroptions)并在返回之前恢复它来模拟C#代码对C#事务的过程亲和性!

2> Bob Probst..:

我不认为这是正确的.

请参阅此处的备注: 设置交易

一次只能设置一个隔离级别选项,并且在显式更改之前,它将保持为该连接设置.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有