Deadlock found when trying to get lock;try restarting transaction问题解决

问题描述:
com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

问题分析:
1、连续多次执行delete语句并且语句中有索引字段,会将索引锁住,导致执行delete语句失败。

出现Mysql死锁通常是两个Mysql客户端都请求更新数据,Update和Delete的时候。

解决办法:

在执行delete语句之前先查询一遍,保证delete语句会删除数据,减少执行不必要的delete语句。

本项目的场景:一个表数据量有近两万万,我要对表的一些数据进行删除,直接适用sql语句,但是由于业务复杂,每个部门的删除规则还不一样,所以如果用sql语句的话,就必须根据配置的部门参数来循环删除。

这样除了使用多线程,还需要根据每个部门设置的参数进行循环删除数据。写完代码后测试就出现了数据库锁死的现象,网上查找各种资料,初步结论是在异步执行删除语句的时候,虽然适用countdownlatch,但是由于sql还没执行完毕,就到下一个循环,而主键id又是在sql语句中使用了的,所以可能就导致了数据库死锁的现象(自认为)。

那么我的解决办法就是,使用逻辑处理,多线程分页查询处理,判断存在某部门设置的参数,就添加到删除的list中,最后执行删除操作。这样就不会导致数据库死锁的现象。

虽然每个业务场景不一样,希望我的解决办法对您有所帮助!!!

posted @   张亮java  阅读(6146)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示