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 @ 2022-08-31 16:09  张亮java  阅读(5762)  评论(0编辑  收藏  举报