概述
问题描述:
测试环境中财务服务对RabbitMQ消息进行消费时,出现异常
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
原因分析:
从上面截图可以看出是发现了mysql的死锁问题
到测试库上执行如下脚本
show engine innodb status;
找到事务1,事务2对应的SQL语句
查找依据:
- SQL语句,根据LATEST DETECTED DEADLOCK提供的死锁时记录的sql语句。
- 线程ID(mysql的唯一标识): MySQL thread id 7102060(事务1被回滚)
- 7102091(事务2)执行时间(时间线):2020-10-16 15:17:08 7ff6fabe3700
解决方案:
经分析,测试库使用的事务级别是REPEATABLE-READ,为了解决幻读(也不是完全解决,要完全解决是使用串行化事务级别),因为要更新的语句中where里的字段都没有索引,所以其使用的是间隙锁,如果两个并发请求进来,需要更新的是相邻的记录,就会出现死锁。
所以有可能出现相邻记录并发更新的情况时,需要将方法设置为同步;
巨人的肩膀:
https://www.jianshu.com/p/6049b046e7b4
https://www.cnblogs.com/hunternet/p/11383360.html
http://blog.sina.com.cn/s/blog_a1e9c7910102vnrj.html
https://www.cnblogs.com/rainy-shurun/p/5166163.html
最后
以上就是清爽面包为你收集整理的20201016-MYSQL死锁问题分析Deadlock found when trying to get lock; try restarting transaction问题描述:原因分析:解决方案:巨人的肩膀:的全部内容,希望文章能够帮你解决20201016-MYSQL死锁问题分析Deadlock found when trying to get lock; try restarting transaction问题描述:原因分析:解决方案:巨人的肩膀:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复