阅读文章前先阅读以下链接, 介绍了mysql 各种 lock 类型
官方文档
https://dev.mysql.com/doc/refman/5.6/en/innodb-locking.html
相关博客
https://blog.csdn.net/L_15156024189/article/details/87298122
1. 数据准备
2.先开启一个事物, 执行如下图中sql语句,暂不commit
3.插入一条sql语句, mysql客户端会阻塞, 等待到了超时时间后就会报> 1205 - Lock wait timeout exceeded; try restarting transaction
原因分析:
在第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;
然后执行以上步骤, 就正常插入了