当前位置:网站首页>Mysql gap lock引起的一个问题
Mysql gap lock引起的一个问题
2022-04-22 05:50:00 【bglmmz】
有时候,我们的后天日志会出现mysql的一些异常,异常信息大概是:Lock wait timeout exceeded try restarting transaction,或者还有...gap...灯字样。
这个原因,一般都是一个线程中的业务逻辑需要先delete,再insert;或者是两个线程,一个线程在delete,一个线程在insert。
关键就在这个delete的where条件上,如果where条件是主键,不会有上面这个问题出现。
如果是普通索引,就会有这个问题出现的可能,这个涉及到的是gap lock问题,当delete where这个语句没有满足条件的记录时,mysql会尝试锁住索引中,where条件的上下位置的其他记录。如果此时要insert记录到其他位置,就会出现这个错误。
举例:
t1中,有数据
1,2,3,7,8,
现在业务方法的逻辑是:
delete from t1 where a=4;
insert t1 (a) values(5);
这时就有异常抛出了。
因为delete where a=4时,表中没有满足条件的记录,mysql会锁住3,7这个区间的索引,此时又要insert 5,这个5 刚好落在3,7这个区间内,也要获得区间3,7的锁才行,这样就造成死锁了。
因此,在需要先delete再insert的业务方法中,在delete前先用相同条件selete一下,有数据则再delete,否则直接insert即可。
这个原因,一般都是一个线程中的业务逻辑需要先delete,再insert;或者是两个线程,一个线程在delete,一个线程在insert。
关键就在这个delete的where条件上,如果where条件是主键,不会有上面这个问题出现。
如果是普通索引,就会有这个问题出现的可能,这个涉及到的是gap lock问题,当delete where这个语句没有满足条件的记录时,mysql会尝试锁住索引中,where条件的上下位置的其他记录。如果此时要insert记录到其他位置,就会出现这个错误。
举例:
t1中,有数据
1,2,3,7,8,
现在业务方法的逻辑是:
delete from t1 where a=4;
insert t1 (a) values(5);
这时就有异常抛出了。
因为delete where a=4时,表中没有满足条件的记录,mysql会锁住3,7这个区间的索引,此时又要insert 5,这个5 刚好落在3,7这个区间内,也要获得区间3,7的锁才行,这样就造成死锁了。
因此,在需要先delete再insert的业务方法中,在delete前先用相同条件selete一下,有数据则再delete,否则直接insert即可。
版权声明
本文为[bglmmz]所创,转载请带上原文链接,感谢
https://blog.csdn.net/bglmmz/article/details/84824376
边栏推荐
猜你喜欢
随机推荐
2021-11-08
第一款Avalon 1246-85T机箱大计算能力低功耗评测
Graylog服务器rpm安装
OOP 7 design principles
laravel路由设置
el-input-number 如何设置初始值为空
算数和逻辑操作
pip freeze 导出含有路径 (@ file:///) 问题小记
PHP opens the file and writes the file contents fopen, feof, fgets
Print various types of variables in PHP log
Redis writes regularly and pulls live streaming video
uniapp原生插件使用
快应用模糊搜索
js逆向:无所不能的 hook 钩子函数
SSH免密登录
involuntarily
2021-09-28
!!!!!!!!!!!!!!!!!!
接口测试Seldom
Experience of soft test preparation and customs clearance









