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

时间:2010-10-04 16:14:07

标签: sql sql-server sql-server-2005 tsql isolation-level

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

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

1 个答案:

答案 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,它不会返回脏数据,但仍然无法锁定