【问题标题】:database unconfirmed deadlock t-sql 2005数据库未确认死锁 t-sql 2005
【发布时间】:2012-07-17 19:45:17
【问题描述】:

例如,存在表 A 和表 B,我需要在 A 和 B 中处理更新,我决定在使用期间对它们进行表锁定(按照我的架构师的要求)。同时,调用另一个过程,该表锁定 B,然后锁定 A。

此交易会完成吗?我感觉它是一个死锁,很确定它没有释放任何资源......

【问题讨论】:

  • 这些锁是表锁还是页锁或行锁
  • 只是好奇你为什么要使用表锁?你会通过使用表锁来阻止很多用户。而且它会增加死锁的机会。你可以使用行级或页级锁吗?
  • 是的,我向我的架构师提出了关于行/页级锁的观点……但客户和管理层希望这样:\
  • 祝你好运..一旦系统投入生产..如果您建议这样做来解决最终用户面临的所有死锁和阻塞问题,您可以成为超级明星..顺便说一句,您是否使用快照隔离级别?

标签: sql-server database tsql sql-server-2005


【解决方案1】:

是的,这可能是死锁。

死锁场景是

您的任务锁定 A
其他任务锁 B

那么 您的任务试图锁定 B 但它不能因为您有锁 和 其他任务试图锁定 A,但它不能像你拥有的那样。

因此,其中一项任务必须失败/回滚,才能完成另一项任务。根据使用的 RDBMS,db 将选择其中之一来终止。

解决方案通常是一个指导方针,即您必须在所有进程中以相同的顺序锁定资源,通常这必须手动强制执行。

【讨论】:

    【解决方案2】:

    是的。这种方法将在here 提到的经典循环死锁中结束@

    使用表级别锁定进行更新是一种矫枉过正。这样做的理由是什么?如果您有正确的索引,则会在键级别获取锁,这有助于多个进程同时访问相关表。

    如果可能,最好以相同的顺序访问表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多