gpt4 book ai didi

SQL Server delete nowait 不起作用

转载 作者:行者123 更新时间:2023-12-04 23:43:23 28 4
gpt4 key购买 nike

我有 3 个表:

架构: enter image description here

例如,我有这样的数据:

1> select id, iddep, idservice from transactions where id = 22
2> go
id iddep idservice
----------- ----------- -----------
22 6 12

我运行以下查询,结果是可预测的:

第一次连接查询:

1> begin tran
2> go
1> select id from transactions with (updlock) where id = 22
2> go
id
-----------
22

二次连接查询:

1> begin tran
2> go
1> delete from transactions with (nowait) where id = 22
2> go
SQL Server Error: 1222 Lock request time out period exceeded

这是 NOWAIT 提示的正常行为,描述内容 here

但是!如果我执行以下查询,结果会很奇怪!

第一个连接查询与第一个示例相同:

1> begin tran
2> go
1> select id from transactions with (updlock) where id = 22
2> go
id
-----------
22

二次连接查询:

1> begin tran
2> go
1> delete from services with (nowait) where id = 12
2> go

我只是尝试删除父行并且.. 没有任何反应!尽管有 nowait 提示,它只是等待行释放。当我释放该行时,父行将被删除。

那么,为什么我不像第一个示例那样只收到 1222 错误?

最佳答案

它就在您链接到的页面中,但可能不明显。 NOWAIT :

Instructs the Database Engine to return a message as soon as a lock is encountered on the table. NOWAIT is equivalent to specifying SET LOCK_TIMEOUT 0 for a specific table.

添加了强调

在您问题的最后一个案例中,DELETE 不是在等待锁定服务() - 它正在等待用于锁定 transactions,以便它可以验证不会违反外键约束。

同样的引用指出了解决它的方法:指定SET LOCK_TIMEOUT 0在您的第二个连接上,它不会等待锁定任何表。

关于SQL Server delete nowait 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12794366/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com