我有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/