一位同事编写了一个查询,该查询使用了提示“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
提示,并且尽管已将其记录为在遇到任何锁定时都返回一条消息,但第二个查询将挂起,等待模式锁定。阅读有关Table Hints的文档:
NOWAIT
:请注意,这是在讨论锁,任何锁。
NOLOCK
(嗯,实际上是READUNCOMMITTED
):因此,
NOLOCK
确实需要等待一些锁。关于sql-server - 为什么要同时使用NOLOCK和NOWAIT?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21884769/