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中,最后执行删除操作。这样就不会导致数据库死锁的现象。
虽然每个业务场景不一样,希望我的解决办法对您有所帮助!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人