考虑以下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]是正确的.有趣的是,根据您链接的文档:
如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别.例如,如果在批处理中设置REPEATABLE READ,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制权返回给批处理时,隔离级别设置将恢复为REPEATABLE READ.
所以,这里的底线是SET TRANSACTION ISOLATION LEVEL具有过程亲和力,而不是事务亲和力(正如我所想的那样).
真棒!
我不认为这是正确的.
请参阅此处的备注: 设置交易
一次只能设置一个隔离级别选项,并且在显式更改之前,它将保持为该连接设置.