定时任务引起的死锁

前言:Java面试题
死锁的场景有哪些?你们是怎么解决的?
锁有哪些特性?

问题现象

1,文件上传报当前功能正在使用,请稍后再试
在这里插入图片描述
2,其他账号登录系统,登录不上去,有个接口锁住了,查询不到数据,

问题排查

1,问题一:

功能是当前只能有一个用户,可以导入,免得数据被覆盖,临时虚拟机直接连接redis,把锁的key删除,打包发上去,还是不行,报mysql连接超时

2,怀疑是配置文件的线程池,查看yml配置文件 ,

          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://11.19.228.206:3306/dev_manage_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true&allowMultiQueries=true
          username: xxsdfs
          password: sdfsfdgsf#2MrN
          type: com.zaxxer.hikari.HikariDataSource
          hikari:
            #最大连接池数
            maximumPoolSize: 5
            #是否自定义配置
            cachePrepStmts: true
            #连接池大小
            prepStmtCacheSize: 20
            #单条语句最大长度
            prepStmtCacheSqlLimit: 2048
            #新版本MySQL支持服务器端准备,是否开启
            useServerPrepStmts: true

修改
#最大连接池数
maximumPoolSize: 50
#是否自定义配置
cachePrepStmts: true
#连接池大小
prepStmtCacheSize: 50
#单条语句最大长度
故障依旧。

3,手动连接数据库,执行

mysql> update t_sys_info set  login_date = '2025-03-18 15:54:48.376000' where id = '1231412';
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

从错误信息 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 可以看出,问题是由于 锁等待超时 导致的。具体原因是:

当前事务尝试获取某个资源的锁,但该资源已被其他事务锁定,且等待时间超过了 MySQL 的锁等待超时时间(默认 50 秒)。

最终,MySQL 强制终止了当前事务,以避免死锁或长时间阻塞。

4,重启服务 manage 服务,重洗登录系统发现还是不行,故障依旧

5,执行

show processlist;
是 MySQL 中的一个命令,用于查看当前 MySQL 服务器上所有客户端连接的状态信息。它可以帮助你了解哪些查询正在执行、哪些连接处于空闲状态、是否有慢查询或阻塞等问题。
在这里插入图片描述
手动kill 进程发现故障依旧

6,数据库手动执行update 一次,但是这里报4次

想到运维之前写个定时任务,备份生产数据。。。。

在这里插入图片描述
什么数据库能15G,最后找到定时任务

在这里插入图片描述

最终发现定时任务多个空格
在这里插入图片描述

解决方案

1,删除备份的数据
2,重启mysql
systemctl restart mysql
3,重启manage , cloud_jar 服务
4,测试功能正常,登录正常OK
5,删除导入的测试数据

心得:找了3个半小时,后面有问题,先看内存,内存满了也会引起死锁!!!!

喜欢我的文章记得点个在看,或者点赞,持续更新中ing…

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐