阅读文章前先阅读以下链接, 介绍了mysql 各种 lock 类型
mysql insert dead lock原因分析

官方文档
https://dev.mysql.com/doc/refman/5.6/en/innodb-locking.html
相关博客
https://blog.csdn.net/L_15156024189/article/details/87298122

1. 数据准备
mysql insert dead lock原因分析

2.先开启一个事物, 执行如下图中sql语句,暂不commit

mysql insert dead lock原因分析

3.插入一条sql语句, mysql客户端会阻塞, 等待到了超时时间后就会报> 1205 - Lock wait timeout exceeded; try restarting transaction
mysql insert dead lock原因分析

原因分析:
在第2步更新语句中, child 使用范围查询, mysql 会加表级锁;然后第3步插入就一直等待表级锁释放, 等到到了超时时间就抛Lock wait timeout exceeded

解决办法, 在birth字段建上索引
CREATE TABLE child (
id int(11) NOT NULL,
name varchar(255) NOT NULL DEFAULT ‘’,
birth varchar(255) NOT NULL DEFAULT ‘’,
PRIMARY KEY (id),
KEY idx_birth (birth) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

然后执行以上步骤, 就正常插入了
mysql insert dead lock原因分析

相关文章: