一位同事编写了一个查询,该查询使用了提示“ with(NOLOCK,NOWAIT)”。
例如
select first_name, last_name, age
from people with (nolock,nowait)
假设:
NOLOCK表示“不必担心任何级别的任何锁,现在就读取数据”
NOWAIT说:“不要等待,如果表被锁定,只会报错”。
问题:
为什么要同时使用两者?当然NOWAIT永远不会实现,因为NOLOCK意味着它无论如何都不会等待锁...?
这是多余的(或者至少是无效的)。在一个查询窗口中,执行:
create table T (ID int not null)
begin transaction
alter table T add ID2 int not null
保持此窗口打开,打开另一个查询窗口并执行:
select * from T WITH (NOLOCK,NOWAIT)
尽管有该NOWAIT
提示,并且尽管已将其记录为在遇到任何锁定时都返回一条消息,但第二个查询仍将挂起,等待Schema锁定。
阅读有关 表格提示 的文档 :
NOWAIT
:
指示数据库引擎在表上遇到锁定后立即返回一条消息
请注意,这里所说的是锁,任何锁。
NOLOCK
(嗯,实际上READUNCOMMITTED
):
READUNCOMMITTED和NOLOCK提示仅适用于数据锁。所有查询,包括具有READUNCOMMITTED和NOLOCK提示的查询,在编译和执行期间均获取Sch-S(模式稳定性)锁。因此,当并发事务在表上持有Sch-M(架构修改)锁时,查询将被阻止。
因此, NOLOCK
确实需要等待 一些 锁。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句