12

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

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

4

1 回答 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)

如您所见,您将重新获得该行

BTW,READ COMMITTED 是默认的隔离级别,不需要设置

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

于 2010-10-04T16:16:35.550 回答