SELECT语句 - 具有SET TRANSACTION ISOLATION LEVEL READ NOUOCK的NOLOCK

Dav*_*ave 11 sql t-sql sql-server sql-server-2005 isolation-level

我的理解是,当在SELECT语句中使用NOLOCK时,它也可以读取未提交的/脏行.但我想利用表上的NOLOCK提示,以便我的SELECT查询能够快速运行.

现在,NOLOCK在桌上但是与"SET TRANSACTION ISOLATION LEVEL READ COMMITTED"一起给我NOLOCK优势和更快的SELECT查询(因为NOLOCK)只有提交的行(因为SET)?

SQL*_*ace 18

是的,表提示会覆盖隔离级别设置,因此您仍会获得脏读

容易测试

先运行这个

create table bla(id int)
insert bla values(1)



begin tran
select * from bla with (updlock, holdlock)
Run Code Online (Sandbox Code Playgroud)

确保不提交tran !! 打开另一个窗口并运行它

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

select * from bla -- with (nolock)
Run Code Online (Sandbox Code Playgroud)

你什么也得不回来.

打开另一个窗口并立即运行

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

select * from bla with (nolock)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,你会回到这一行

BTW,READ COMMITTED是默认的隔离级别,无需设置它

查看快照隔离,它不会返回脏数据,但仍然无法锁定