问题
com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
mysql 获取锁超时默认50秒
原因
1、后台服务定时任务0点去封禁超过指定时间的未登录的测试用户,同时去清除测试用户的余额。
2、清除余额的操作通过发送mq的形式去触发的,由于定时任务和清除余额是在同一个事务中,
在清除过程中有插入记录的操作,然后消费者(前台服务)在接收到消息时需要对记录进行更新操作,但由于此时定时任务未执行完。事务还没提交,所以导致消费端一直获取不到锁。
解决
清除余额独立事务,每一个用户使用一个事务。
潜在问题:用户封禁成功,余额清除失败,这种情况业务上是允许的,本身通过异步消息的形式没办法在同一事务中。