定时任务引起的死锁
定时任务引起的死锁
前言: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…