这个是非常经典的一个场景,在网上搜索插入意向锁造成的死锁,绝大部分都会指向这个例子
(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)
表结构
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` varchar(5),
`b` varchar(5),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_name` (`a`,`b`)
);
三个事务的 insert 语句都是insert ignore into t1(a, b)values("1", "1");
复现步骤如下:
t1 | t2 | t3 | 备注 |
---|---|---|---|
begin | begin | begin | |
insert | 成功 | ||
insert | 把 t1 的隐式锁提升为 X 锁,t2 进入进入 S 锁等待 | ||
insert | t3 进入进入 S 锁等待 | ||
rollback; | t1 回滚以后,释放 X |