我们已经收到了一些死锁,这是我们最新的SHOW ENGINE INNODB STATUS
UPDATE actions SET
hv_clientid='56c46db2dd',
hv_clientid_time=NOW(),
hv_lastcheck=NOW()
WHERE
hv_callid!=''
AND is_done='N'
AND (hv_lastcheck
BETWEEN DATE_SUB(NOW(),INTERVAL 8 HOUR)
AND DATE_SUB(NOW(),INTERVAL 120 SECOND)
OR hv_lastcheck='0000-00-00 00:00:00')
AND (
hv_clientid IS NULL
OR (
hv_clientid_time IS NOT NULL
&& hv_clientid_time<DATE_SUB(NOW(),INTERVAL 2 MINUTE)
)
)
LIMIT 60
UPDATE actions SET
hv_clientid=NULL,
result='answer',
is_done='Y',
hv_callid=''
WHERE action_id='145291132'
我们有多个脚本实例来检查要更新的状态。 查询1 应该抓取行,然后根据设置的hv_clientid
选择行。一旦选择迭代数据,它就会运行 Query 2 。
为什么会这样?
答案 0 :(得分:1)
来自MySQL Documentation - 14.2.7.9 How to Cope with Deadlocks(突出显示已添加):
在事务中修改多个表时,或不同 同一个表中的行集,以一致的方式执行这些操作 每次订购。然后事务形成明确定义的队列而不是 僵局。例如,将数据库操作组织到函数中 在您的应用程序中,或调用存储的例程,而不是编码 中有多个类似的INSERT,UPDATE和DELETE语句序列 不同的地方。
如果这是原因,向查询1 添加ORDER BY
子句应该会有所帮助。