最近有同事在项目上遇到一个场景,定时任务在往MySql插入一条数据超时了,而排查其他SQL,没有锁表的动作。排查到最后,发现是分区表导致id不唯一,加上Gap锁导致的。下面简单分析一下。
1.场景重现
1.1 没有分区的场景
先建一个没有分区的表
1 CREATE TABLEstudent (2 `id` INT NOT NULL PRIMARY KEY,3 `name` VARCHAR (128) DEFAULT NULL,4 `country` VARCHAR(64)5 ) ENGINE = INNODB DEFAULT charset = utf8;
插入一些数据
1 INSERT INTOSTUDENT (`id`, `name`, `country`)2 VALUES
3 (1, 'name1', 'CHINA'),4 (3, 'name3', 'JAPAN'),5 (5, 'name5', 'USA'),6 (7, 'name7', 'JAPAN'),7 (9, 'name9', 'CHINA');
此时开启一个事务(称为事务1),把id=5的数据改为changed
事务1未提交,同时在另外一个窗口,再开一个事务(称为事务2)&#x