SQL Server删除nowait不起作用

时间:2012-10-09 06:52:50

标签: sql sql-server transactions

我有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错误?

1 个答案:

答案 0 :(得分:3)

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

  

指示数据库引擎在上遇到锁定后立即返回消息。 NOWAIT相当于为特定表格指定SET LOCK_TIMEOUT 0

强调添加

在您的问题的最后一个案例中,DELETE并未等待锁定services表格) - 它正在等待锁定transactions 1}}以便它可以验证不会违反外键约束。

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