MySQL死锁2更新

时间:2014-04-18 16:09:12

标签: mysql innodb database-deadlocks

我们已经收到了一些死锁,这是我们最新的SHOW ENGINE INNODB STATUS

查询1:

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

查询2:

UPDATE actions SET
    hv_clientid=NULL,
    result='answer',
    is_done='Y',
    hv_callid=''
WHERE action_id='145291132'

我们有多个脚本实例来检查要更新的状态。 查询1 应该抓取行,然后根据设置的hv_clientid选择行。一旦选择迭代数据,它就会运行 Query 2

为什么会这样?

1 个答案:

答案 0 :(得分:1)

来自MySQL Documentation - 14.2.7.9 How to Cope with Deadlocks(突出显示已添加):

  

在事务中修改多个表时,或不同   同一个表中的行集,以一致的方式执行这些操作   每次订购。然后事务形成明确定义的队列而不是   僵局。例如,将数据库操作组织到函数中   在您的应用程序中,或调用存储的例程,而不是编码   中有多个类似的INSERT,UPDATE和DELETE语句序列   不同的地方。

如果这是原因,向查询1 添加ORDER BY子句应该会有所帮助。