我想寻求帮助:)
两个用户同时向原则生成的多对多表发出两个 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)最终会出现同样的差距?
我唯一能想到的是我们正在处理复合主键而不是简单的整数?这里的解决方案是什么?删除主键并创建自增?
感谢您的帮助。
| 归档时间: |
|
| 查看次数: |
476 次 |
| 最近记录: |