我的理解是,当在SELECT语句中使用NOLOCK时,它也可以读取未提交的/脏行。但我想利用表上的NOLOCK提示,以便我的SELECT查询能够快速运行。
现在,NOLOCK在桌上但是与“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”一起给我NOLOCK优势和更快的SELECT查询(因为NOLOCK)只有提交的行(因为SET)?
答案 0 :(得分:17)
是的,表提示会覆盖隔离级别设置,因此您仍会获得脏读
易于测试
首先运行此
create table bla(id int)
insert bla values(1)
begin tran
select * from bla with (updlock, holdlock)
确保不提交tran !! 打开另一个窗口并运行此
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
select * from bla -- with (nolock)
你没有得到任何回报。
打开另一个窗口并立即运行
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
select * from bla with (nolock)
你可以看到你会回到行
BTW,READ COMMITTED是默认的隔离级别,无需设置
查看Snapshot Isolation,它不会返回脏数据,但仍然无法锁定