当前位置:   article > 正文

解决MySql事务引起CannotAcquireLockException的问题

cannotacquirelockexception

我们在开发中,有时候需要手动开启事务,千万要记得,事务开启了之后,要么commit,要么rollback,如果在中间环节跳过,那么其他业务也要申请这个表的事务锁的时候,它们只有等待锁超时之后才是能获取到锁,于是就出现如下异常:

org.springframework.dao.CannotAcquireLockException: PreparedStatementCallback; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction......

我以Magic-Api的SQLModule操作来举个例子。

1、错误的使用方式

  1. @Component
  2. @RequiredArgsConstructor
  3. public class TxDemo {
  4. private final SQLModule db;
  5. public void doSomething() {
  6. Transaction tx = db.transaction();
  7. try {
  8. // 直接return出去,或者在try外层有for循环的时候continue,都会导致tx没有提交事务,只有等待超时,这时候其他业务在竞争事务锁的时候都是处于等待状态,那就会导致出现主题的错误问题
  9. return;
  10. }catch (Exception e) {
  11. tx.rollback();
  12. }
  13. }
  14. }

2、正确的使用方式

  1. @Component
  2. @RequiredArgsConstructor
  3. public class TxDemo {
  4. private final SQLModule db;
  5. public void doSomething() {
  6. Transaction tx = db.transaction();
  7. try {
  8. // 正常提交事务
  9. tx.commit();
  10. }catch (Exception e) {
  11. tx.rollback();
  12. }
  13. }
  14. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/729305
推荐阅读
相关标签
  

闽ICP备14008679号