mysql插入重复键相关的死锁

问题描述 投票:4回答:1

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

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,它具有相同的锁定问题。

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

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

mysql
1个回答
-2
投票

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

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

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

我会试着看看死锁是否消失以确认它是由IF引起的。

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

© www.soinside.com 2019 - 2024. All rights reserved.