在日志中,我遇到与此查询相关的死锁:
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,它具有相同的锁定问题。
表在重复键查询和选择查询上获得了大量这些插入(所有选择查询都非常快速且优化)。事务不在任何地方使用,也不用手动锁定等。
你能否提出任何可能导致这种情况的想法?
答案 0 :(得分:-2)
为什么在ON DUPLICATE KEY UPDATE中有一个IF语句?
我认为你的问题就在那里。看起来你在说是否有重复键,根据状态值设置状态值。
ON DUPLICATE KEY UPDATE state ='waiting'有什么问题?
我会尝试这一点来查看死锁是否消失以确认它是由IF引起的。
我还会在这里更详细地解释你想要做什么。