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

时间:2008-10-21 20:42:22

标签: sql-server transactions

考虑以下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。这是对的吗?

2 个答案:

答案 0 :(得分:7)

我认为这不正确。

请参阅此处的评论:Set Transaction

  

只有一个隔离级别   可以一次设置选项   保持为该连接设置,直到   它明确改变了。

答案 1 :(得分:7)

你[Bob Probst]是正确的。有趣的是,根据您链接的documentation

  

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

所以,这里的底线是SET TRANSACTION ISOLATION LEVEL具有过程关联性,而不是事务关联性(正如我所想)。

真棒!

相关问题