mysql插入重复键相关的死锁

时间:2016-09-30 16:18:26

标签: mysql

在日志中,我遇到与此查询相关的死锁:

INSERT INTO `driver_state` (id, state)
  VALUES('83799','waiting')
ON DUPLICATE KEY UPDATE    
  state = IF(state = 'active', state, VALUES(state));

确切错误:

ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction 

我试图推理并理解这个查询怎么可能导致死锁,但还没有走得太远。

表格结构

 CREATE TABLE IF NOT EXISTS `driver_state` (
   `id` int(11) NOT NULL,
   `state` enum('inactive','waiting_orders','has_order','busy') DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;

在这种情况下,我们使用MEMORY表,但对于InnoDB,它具有相同的锁定问题。

表在重复键查询和选择查询上获得了大量这些插入(所有选择查询都非常快速且优化)。事务不在任何地方使用,也不用手动锁定等。

你能否提出任何可能导致这种情况的想法?

1 个答案:

答案 0 :(得分:-2)

为什么在ON DUPLICATE KEY UPDATE中有一个IF语句?

我认为你的问题就在那里。看起来你在说是否有重复键,根据状态值设置状态值。

ON DUPLICATE KEY UPDATE state ='waiting'有什么问题?

我会尝试这一点来查看死锁是否消失以确认它是由IF引起的。

我还会在这里更详细地解释你想要做什么。