问题
首先来看问题:一个接口无法访问,报了异常 MySQLTransactionRollbackException;
问题排查
首先想到了是不是事务死锁导致,所以查看了当前数据库的事务状态,果然有一个事务已经开启两个小时了没有关闭。
问题分析
其实这个接口并发量并不高,无非前端可能出现连续点击的问题,所以我想事务死锁应该是这样发生的:请求接口,当进行数据库事务提交的时候,发现事务 version 重复,这个时候等待,等待超时,需要回滚,回滚失败,导致事务一直等待,所以导致后面的请求全部死锁。(至于事务到底为什么会出现回滚失败问题,确实不太清楚,还请各位大佬指点)
解决办法
解决办法非常简单,就是给这段操作加上分布式锁,网上分布式锁的教程有很多,这里就不贴代码了,我用的是 Redisson。