【问题标题】:Can deadlock on database tables allows other queries to execute数据库表上的死锁是否允许执行其他查询
【发布时间】:2014-09-27 07:24:15
【问题描述】:

我正在使用 Microsoft SQL Server。我知道它使用并行处理。但我想知道,说同一表上的两个更新查询X 变成死锁情况,第三个查询针对另一个表Y,因此 SQL 服务器将允许运行第三个查询,否则它将阻塞,直到 SQL 服务器恢复从僵局?我试图将场景放在图像中以获得更好的解释。

【问题讨论】:

  • 如果我没记错的话,死锁将被释放,查询 3 将能够通过
  • @Steve 你的意思是查询 3 在服务器从死锁中恢复之前不会执行,对吧?
  • @VickyThakor 如果 tableX 中只有锁,则对 tableY 的查询将照常运行。锁定整个数据库实例以针对另一个表进行查询会完全降低性能。
  • 我的意思是,一旦服务器通过终止查询 1 和 2 检测到死锁情况,它很可能会消除死锁情况

标签: sql sql-server deadlock


【解决方案1】:

在大多数正常情况下,Q3 不会受到 Q1 和 Q2 之间的死锁的影响,因为所占用的锁将最多可能是针对表 X 的页锁或行锁。

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

Q3 被阻塞的一种可能情况是,如果其他任何一个先前在使用holdlock 选项的事务中访问过表Y,则可能会发生这种情况。例如:

Q1

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;

这很做作,但是 Q1 已经获得了表 Y 上的更新锁,该锁一直保持到事务结束,从而阻止了来自 Q3 直到事务完成(并且解决了死锁)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多