我有3张桌子:
架构:
例如,我有以下数据:
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错误?
答案 0 :(得分:3)
它就在您链接的页面中,但可能并不明显。 NOWAIT
:
指示数据库引擎在表上遇到锁定后立即返回消息。
NOWAIT
相当于为特定表格指定SET LOCK_TIMEOUT 0
。
强调添加
在您的问题的最后一个案例中,DELETE
并未等待锁定services
(表格) - 它正在等待锁定transactions
1}}以便它可以验证不会违反外键约束。
同样的引用指出了解决问题的方法:在第二个连接上指定SET LOCK_TIMEOUT 0
,它不会等待任何表上的锁定。