多线程下mysql批量删除死锁报错

参考:
https://www.jianshu.com/p/59e944f68128
https://blog.csdn.net/huo065000/article/details/116269388
项目框架:Springboot+JPA
近期接到一个需求,需要从第三方服务商接口同步数据,因为想提高数据的入库效率,采用线程池来分批入库数据,因为是按天去更新数据,当前的数据可能存在昨天的数据(昨天的数据被更新过),所以采用了先删除后插入的方式,防止频繁update操作影响性能;
在代码运行后,四个线程,每个线程1000条主表数据,大概1500条子表数据,主表根据主键ID删除,子表根据主表的主键ID删除(主表的主键ID作为主子表关联的字段,数据库为单例),系统运行一段时间后抛出异常:

Lock wait timeout exceeded; try restarting transaction

经排查,是因为删除数据的性能跟不上导致的表数据死锁

解决方案

给子表的主键ID字段加上索引,提高删除效率,或者在删除之前先执行一边select,但是这样效率会存在问题,不推荐

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×