3

我有 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 提示的正常行为,此处描述的内容

但!如果我做以下查询,结果很奇怪!

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

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

4

1 回答 1

3

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

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

强调添加

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

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

于 2012-10-09T07:17:55.107 回答