考虑以下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
。这是对的吗?
答案 0 :(得分:7)
答案 1 :(得分:7)
你[Bob Probst]是正确的。有趣的是,根据您链接的documentation:
如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别。例如,如果批量设置REPEATABLE READ,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制权返回给批处理时,隔离级别设置将恢复为REPEATABLE READ。
所以,这里的底线是SET TRANSACTION ISOLATION LEVEL具有过程关联性,而不是事务关联性(正如我所想)。
真棒!