插入意向锁导致复合主键死锁

ill*_*cal 7 mysql sql

我想寻求帮助:)

两个用户同时向原则生成的多对多表发出两个 INSERT 语句:

INSERT INTO my_table (col1, col2) VALUES (2271885, 16678); <-- user 1
INSERT INTO my_table (col1, col2) VALUES (2271883, 2550); <-- user 2
Run Code Online (Sandbox Code Playgroud)

发生死锁(是一个写密集型表),分析发现两个事务都试图写入表中的同一空间:

*** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 178586 page no 9618 n bits 176 index PRIMARY of table `my_company`.`my_table`...

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 178586 page no 9618 n bits 176 index PRIMARY of table `my_company`.`my_table`...
Run Code Online (Sandbox Code Playgroud)

我想我很难理解为什么会出现僵局。这是一个经典的多对多表,没什么花哨的。

是的,它是写密集型的,但话又说回来,MySQL 文档清楚地说明了有关插入意向锁的情况:

假设存在值为 4 和 7 的索引记录。分别尝试插入值 5 和 6 的单独事务在获得插入行上的排他锁之前,每个事务都使用插入意向锁锁定 4 和 7 之间的间隙,但不要互相阻塞,因为行不冲突。

为什么 MySQL 会计算出这个值(2271885, 16678)并且(2271883, 2550)最终会出现同样的差距?

我唯一能想到的是我们正在处理复合主键而不是简单的整数?这里的解决方案是什么?删除主键并创建自增?

感谢您的帮助。