Caused by: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
如果下图所示:
这个前置服务执行时间较长,平均耗时10min+
由于这个任务在入口方法上使用了事务,如果服务内的所有原子任务不全部执行完成,期间所有的变更就都不会被提交到MySQL,即服务未结束前,所有被update的记录,在这10min内,其它任何试图更新这些记录的操作都会出现更新失败。
猜测应该就是这个数据库大事务造成的
case:
需要步骤1.中的服务未结束前,也更新同一条记录。
期望:在步骤2执行时报错:
Lock wait timeout exceeded; try restarting transaction
code:
1.触发要执行5分钟的服务:要先执行,且更新id=1的记录
同样的报错出现了!!!
就本次的情况,将耗时任务的事务去掉了。 当前场景,虽然一个原子任务会有两次更新数据库,但都是同一条记录按id进行更新。这种情况出错的可能性很小。 即使出错,再触发一次就可以解决,即具备自愈性,系统自身能保证最终一致。
一定要使用事务的场景:有多个操作,如果不同时提交变更,最终数据肯定会不一致。即没有人工干涉,不可能自愈。
事务期间,会占用一个数据库连接,影响服务的并发。 事务不提交,非当前事务的服务都看不到已经做出的变更。 即同一个时间点,同一条数据在某个时间点有多个状态同时存在,是引发数据不一致的"坏味道"
一个事务使用不当的“坏味道”:
”犯错不是最可怕的,蠢才是” 所谓蠢,上面一春,下面两个虫。春暖花开天气回暖,虫子们都开始活动,很多虫在一起动,又不能像人一样有秩序。看起来就很乱,所以乱动为之蠢。形容一个人胡乱的操作可以谓之蠢。