在日志中我有与此查询相关的死锁:
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/