一位同事编写了一个查询,该查询使用了提示“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/

10-12 17:39