前言:本文为笔者自己对线上出现的一次死锁进行的分析,欢迎指正。
异常
线上跑自动化测试时,出现了异常:
org.springframework.dao.DeadlockLoserDataAccessException:
### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException:
Deadlock found when trying to get lock; try restarting transaction
### The error may exist in com/XXXX/arch/sso/mapper/RoleMenuMapper.java (best guess)
### The error may involve com.XXXX.arch.sso.mapper.RoleMenuMapper.insertSelective-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO role_menu_info ( id,role_id,menu_id ) VALUES( ?,?,? )
数据表
MySQL 版本 5.7,InnoDB 引擎,事务隔离级别默认的 RR(开启 Next-key 锁)。
数据表结构:
CREATE TABLE `role_menu_info` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
`role_id` varchar(30) NOT NULL DEFAULT '' COMMENT '角色id',
`menu_id` varchar(30) NOT NULL DEFAULT '' COMMENT '菜单id',
`is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否删除:0-未删除,1-已删除',
PRIMARY KEY (`id`)