我的理解是,当在 SELECT 语句中使用 NOLOCK 时,它也可以读取未提交/脏行。但我想利用表上的 NOLOCK 提示,以便我的 SELECT 查询运行得更快。
现在,表上的 NOLOCK 但与“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”一起是否给我 NOLOCK 优势和更快的 SELECT 查询(因为 NOLOCK)只有提交的行(因为 SET)?
我的理解是,当在 SELECT 语句中使用 NOLOCK 时,它也可以读取未提交/脏行。但我想利用表上的 NOLOCK 提示,以便我的 SELECT 查询运行得更快。
现在,表上的 NOLOCK 但与“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”一起是否给我 NOLOCK 优势和更快的 SELECT 查询(因为 NOLOCK)只有提交的行(因为 SET)?
是的,表提示会覆盖隔离级别设置,因此您仍然会收到脏读
易于测试
首先运行这个
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 是默认的隔离级别,不需要设置
看看快照隔离,它不会给你返回脏数据但仍然不会锁定