【问题标题】:Deadlock detected with this SQL statement?此 SQL 语句检测到死锁?
【发布时间】:2013-02-23 09:12:18
【问题描述】:

我对下面的说法有些问题,有人知道吗?

感谢任何cmets!

UPDATE tableTx 
SET tableTx.ResultCode = 0 
WHERE tableTx.id in (SELECT tableTxInfo.id 
                     FROM tableTxInfo 
                     WHERE tableTxInfo.messageId = 'john-to-bob' 
                     and tableTx.ResultCode != 1)

tableTxtableTxInfoid 相同(用作INTEGER PRIMARY KEY) 对于新事务,将为tableTxtableTxInfo 创建一个具有相同id 的新记录。

我有大约 40000 条 messageId = "john-to-bob" 记录。

当我尝试从两个不同的线程执行上述 SQL 语句时,一个挂起很长时间,另一个线程刚刚得到响应:

事务检测到死锁,事务被回滚。

我对 SQL 和数据库概念不太熟悉。有什么办法可以防止这种错误发生吗?

我的数据库是 IBM soliddb

【问题讨论】:

  • 你用 40k 的一个子集试过这个吗?可能是因为脚本认为它发生了死锁。
  • 先尝试在你的表上设置写锁。
  • 感谢 cmets,PCoelho 是对的,操作花费了很长时间,以至于另一个线程超时并返回了死锁错误。修改SQL语句后问题消失~~

标签: sql database ibm-soliddb


【解决方案1】:

你可以这样试试:

UPDATE tableTx 
SET tableTx.ResultCode = 0 
WHERE tableTx.id in (SELECT tableTxInfo.id 
                     FROM tableTxInfo 
                     WHERE tableTxInfo.messageId = 'john-to-bob') 
      AND tableTx.ResultCode != 1;

这可能会阻止两个查询之间的循环依赖。

祝你好运!

【讨论】:

  • 感谢 mrhobo,它确实变得更快了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多