1、建表:
- CREATE TABLE `test_dead_lock` (
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
- `user_id` bigint(20) unsigned NOT NULL COMMENT 用户id',
- `user_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
- `type` int(10) DEFAULT '0' COMMENT '类型',
- PRIMARY KEY (`id`),
- UNIQUE KEY `unique_idx` (`user_id`,`user_name`),
- KEY `idx_name` (`user_name`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试死锁表';
mysql 5.7,事务隔离级别RR,会话自动提交事务关闭【set autocommit=off;】
2、数据准备
- INSERT INTO `test_dead_lock` (`id`, `user_id`, `user_name`, `type`)
- VALUES
- (1,1,'name22',0),
- (2,2,'name22',0),
- (3,3,'name3',0),
- (4,4,'name22',0),
- (9,8,'name8',0),
- (12,10,'name10',0),
- (41,10,'name100',0),
- (64,11,'name11A',0),
- (65,12,'name12A',0);
3、事务处理
| 事务1 | 事务2 | 备 注 |
| start transaction; | ||
| start transaction; | ||
| delete from test_dead_lock where user_id=5 ; | 不存在数据,加间隙锁 | |
| delete from test_dead_lock where user_id=6 ; | 不存在数据,加间隙锁 | |
| insert ignore into test_dead_lock (user_id,user_name) (5,'name5A'),(5,'name5AA'); | 加插入意向锁,等待2事务间隙锁释放 | |
| insert ignore into test_dead_lock (user_id,user_name) (6,'name6A'),(6,'name6AA'); | 加插入意向锁,等待1事务间隙锁释放 死锁 | |
| rollback; | rollback; |
备注:也可以直接 delete 13,14,插入13,14数据来验证,间隙锁范围是正无穷。
4、死锁日志
show engine innodb status;

5、涉及知识点:
(1)mysql 事务隔离级别
(2)mysql 锁