8

考虑以下 SQL:

开始传输
设置事务隔离级别读取已提交

插入乐队
    ( 姓名 )
选择“Depeche 模式”
联盟
选择“街机火灾”

    -- 我已经缩进了内部事务以使其更清晰。

    开始传输
    设置事务隔离级别读取未提交

    选择 *
      从乐队

    犯罪

-- 这里的隔离级别是多少?

更新乐队
   SET Name = '谦虚的老鼠'
 WHERE Name = 'Oddest House'

犯罪

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

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

4

2 回答 2

11

你[鲍勃普罗布斯特]是正确的。有趣的是,根据您链接的文档:

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

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

惊人的!

于 2008-10-22T07:37:00.257 回答
8

我不认为这是正确的。

参考这里的备注: 设置交易

一次只能设置一个隔离级别选项,并且它会一直为该连接设置,直到它被显式更改。

于 2008-10-21T21:13:37.283 回答