【工作记录】Lock wait timeout exceeded; try restarting transaction

     值班过程中,通过自助运维平台,发现了每分钟都会抛出这个Exception,同时数据库报警:

   【工作记录】Lock wait timeout exceeded; try restarting transaction

      很明显,死锁了。


      数据库锁的粒度为行锁,且报出的Exception都是在“打印合同”的时候,之前也出现过这个问题,而且很有规律性,固定的几个功能会死锁。


Solution:

      1.通行方案,首先杀掉数据库的对应进程,这个过程很多教程,我们也是先找到id,之后kill掉。(奈何没有权限,只能打电话给DBA杀死)。

      2.杀死之后,发现一会儿问题复现了。。。。。我了个擦,堪比打地鼠,干掉了,又复现了。。。。

      思考:

      如上所述,杀掉进程只是暂缓之计,问题的根源在哪里?

      因为每次都是那几个方法,会报出这个问题,就不得不去找找规律了。后来发现,被Spring的@Transaction标注的这几个方法,方法还是挺大。经过和DBA沟通,数据库层面执行这个事务,要几秒中的时间。那么问题就基本可以从这个方向思考:

      事务太慢,行锁拿着一直不释放(打印合同里同时有select和update),只要解决事务慢的问题,应该就可以解决这个死锁了。

      策略:

      1.拆分,把不需要回滚的代码,放到Transaction之外,缩短事务执行时间。

      2.网上有人说,对于update,拆分成delete + inset,会很快吗?没有试验。


     总之,解决问题,要找到本源。