SELECT语句 - 使用NOLOCK和SET TRANSACTION ISOLATION LEVEL READ COMMITTED

12
我理解的是,在SELECT语句中使用NOLOCK时,它也可以读取未提交/脏数据行。但是我想利用表上的NOLOCK提示,以便我的SELECT查询运行得更快。
现在,如果我在表上使用NOLOCK,同时加上“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”,是否会让我获得NOLOCK的优势和更快的SELECT查询(因为有了NOLOCK),同时只读已提交的行(因为有了SET)?
1个回答

19

是的,表提示会覆盖隔离级别设置,因此你仍然会得到脏读。

很容易测试。

首先运行这个。

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)

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

顺便提一下,READ COMMITTED 是默认的隔离级别,无需设置

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接