我有3张 table :

架构:

例如,我有如下数据:

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

我只是尝试删除父行,然后......没有任何 react !尽管有 nowait 提示,它只是等待行释放。当我释放该行时,父行被删除。

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

最佳答案

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



强调添加

在您的问题的最后一种情况下, DELETE 不等待 services ( )上的锁定 - 它正在等待 transactions 上的锁定,以便它可以验证不会违反外键约束。

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

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

10-13 08:01