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

有帮助吗?

解决方案

我认为这不正确。

请参阅此处的评论:设置交易

  

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

其他提示

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

  

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

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

真棒!

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