草庐IT

mysql insert on duplicate key related deadlock

coder 2023-10-14 原文

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

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

表有很多这样的插入重复键查询和选择查询(所有选择查询都非常快速和优化)。交易不在任何地方使用,也没有手动锁定等。

您能否提出任何可能导致此问题的想法?

最佳答案

为什么你的 ON DUPLICATE KEY UPDATE 中有 IF 语句?

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

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

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

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

关于mysql insert on duplicate key related deadlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39795897/

有关mysql insert on duplicate key related deadlock的更多相关文章

随机推荐