我正在使用Microsoft SQL Server。我知道它使用并行处理。但我想知道,在同一个表X
上说两个更新查询变成死锁情况,第三个查询在另一个表Y
中出现,所以SQL服务器将允许运行第三个查询或者它将阻止直到SQL服务器从死锁中恢复?我试图将场景放在图像中以便更好地解释。
答案 0 :(得分:1)
在大多数正常情况下,Q 3 将不受Q 1 和Q 2 之间的死锁的影响,因为所采取的锁定最多可能是针对表 X 的页锁或行锁。
实际上,我无法想象如果前两个查询中的任何一个获得表锁,就会发生死锁的情况。但那仍然是表 X ,而不是 Y ,它没有现有的锁。
如果其他任何一方先前在使用holdlock
选项的事务中访问了表 Y ,则可能会出现Q 3 被阻止的一种情况。例如:
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 直到事务完成(并解决了死锁)。