使用相同索引键插入多个事务会导致mysql InnoDB死锁

使用相同索引键插入多个事务会导致mysql InnoDB死锁,mysql,multithreading,innodb,database-deadlocks,Mysql,Multithreading,Innodb,Database Deadlocks,摘自mysql手册() ,insert语句存在死锁情况: 假设InnoDB表t1具有以下结构: 现在假设三个会话按顺序执行以下操作: 第1场会议: 第2次会议: 第3次会议: 第1场会议: 会话1的第一个操作获取该行的独占锁。会话2和会话3的操作都会导致重复密钥错误,并且它们都会请求该行的共享锁。当会话1回滚时,它将释放其在行上的独占锁,并授予会话2和3的排队共享锁请求。此时,会话2和会话3处于死锁状态:由于另一个会话持有共享锁,因此这两个会话都无法获取该行的独占锁 现在一个很大的疑问出现了,为

摘自mysql手册() ,insert语句存在死锁情况:

假设InnoDB表t1具有以下结构:

现在假设三个会话按顺序执行以下操作:

第1场会议:

第2次会议:

第3次会议:

第1场会议:

会话1的第一个操作获取该行的独占锁。会话2和会话3的操作都会导致重复密钥错误,并且它们都会请求该行的共享锁。当会话1回滚时,它将释放其在行上的独占锁,并授予会话2和3的排队共享锁请求。此时,会话2和会话3处于死锁状态:由于另一个会话持有共享锁,因此这两个会话都无法获取该行的独占锁


现在一个很大的疑问出现了,为什么会话2和会话3在出现重复密钥错误时不请求一个排他锁,这样,会话2和会话3就可以排队等待排他锁,它们都可以一个接一个地得到处理。但我怀疑这个论坛上是否有实现者——他们需要解决这个问题。是的,你说得对,我将在mysql论坛上尝试这个问题
CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;
START TRANSACTION;
INSERT INTO t1 VALUES(1);
START TRANSACTION;
INSERT INTO t1 VALUES(1);
START TRANSACTION;
INSERT INTO t1 VALUES(1);
ROLLBACK;