【问题标题】:Why Would these Two Database Commits Deadlock?为什么这两个数据库会提交死锁?
【发布时间】:2012-07-19 14:04:52
【问题描述】:
<executionStack>
     <frame procname="adhoc" line="1" sqlhandle="0x02000000cb01b3329478b4bbe70e115ebcb8f5f4a8610e7e">
(@1 varchar(8000),@2 varchar(8000),@3 varchar(8000),@4 varchar(8000))UPDATE [TABLE_NAME] set [END_TIME] = @1,[ERROR] = @2  WHERE [USER_ID]=@3 AND [SESSION_ID]=@4 AND [END_TIME] IS NULL     </frame>
     <frame procname="adhoc" line="1" sqlhandle="0x02000000ef595e01eab1df10c694910f5810afb17d814663">
UPDATE TABLE_NAME SET END_TIME='2012-03-30 12:07:45', ERROR='FALSE' WHERE USER_ID='username' AND SESSION_ID='095d42ad-67d8-444f-8e51-4576f6b940d8' AND END_TIME IS NULL     </frame>
 </executionStack>

以上是客户从网站发送给我的死锁跟踪的净化实例。据我了解,当两次提交尝试无序访问相同的表时,就会发生死锁。

然而,在这种情况下,只有一个表,执行这些 sql 语句的代码将它们从队列中拉出并按顺序执行。

为什么会出现这种僵局?

【问题讨论】:

  • 这些语句所涉及的事务中还发生了什么?
  • 您需要添加锁资源、所有者和服务员,以了解死锁信息。它们在 XML 中。

标签: java sql-server database-deadlocks


【解决方案1】:

这取决于 DBMS,但是当两个不同的用户会话尝试锁定另一个会话也试图不受限制地访问的资源(行或表)时,可能会发生死锁,而不必发生提交。

Session 1 :  lock  <row x>   (e.g. read for update)
Session 2 :  lock  <row y>   (e.g. read for update)
Session 1 :  fetch <row y>
Session 2 :  fetch <row x>

如果获取或其他操作需要解锁访问或干净读取,则存在死锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多