数据库表上的死锁可以允许其他查询执行

时间:2014-09-27 07:24:15

标签: sql sql-server deadlock

我正在使用Microsoft SQL Server。我知道它使用并行处理。但我想知道,在同一个表X上说两个更新查询变成死锁情况,第三个查询在另一个表Y中出现,所以SQL服务器将允许运行第三个查询或者它将阻止直到SQL服务器从死锁中恢复?我试图将场景放在图像中以便更好地解释。

enter image description here

1 个答案:

答案 0 :(得分:1)

在大多数正常情况下,Q 3 将不受Q 1 和Q 2 之间的死锁的影响,因为所采取的锁定最多可能是针对表 X 的页锁或行锁。

实际上,我无法想象如果前两个查询中的任何一个获得表锁,就会发生死锁的情况。但那仍然是表 X ,而不是 Y ,它没有现有的锁。

如果其他任何一方先前在使用holdlock选项的事务中访问了表 Y ,则可能会出现Q 3 被阻止的一种情况。例如:

Q <子> 1

begin transaction;

select * from Y where some_col = 'goats' with (updlock, holdlock);

update X set other_col = 'alpacas' where animal = 'best'; -- deadlock occurs here

commit transaction;

这是非常人为的,但是Q 1 已经获得了对表 Y 的更新锁定,该更新锁定一直持续到事务结束,阻止来自Q 3 直到事务完成(并解决了死锁)。