美文网首页
Spring事务异常回滚

Spring事务异常回滚

作者: changhr2013 | 来源:发表于2018-11-21 16:35 被阅读0次

默认 spring 事务只在发生未被捕获的 RuntimeExcetpion 时才会回滚。

  • 类似这样的方法不会回滚:
    if(userSave) {
        try {
            userDao.save(user);
            userCapabilityQuotaDao.save(capabilityQuota);
        } catch (Exception e) {
            logger.info("能力开通接口,开户异常,异常信息:" + e);
        }
    }
  • 下面的方法会回滚:
    if(userSave) {
        try {
            userDao.save(user);
            userCapabilityQuotaDao.save(capabilityQuota);
        } catch (Exception e) {
            logger.info("能力开通接口,开户异常,异常信息:" + e);
            throw new RuntimeException();
        }
    }

或者

    if(userSave) {
        try {
            userDao.save(user);
            userCapabilityQuotaDao.save(capabilityQuota);
        } catch (Exception e) {
            logger.info("能力开通接口,开户异常,异常信息:" + e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }

spring aop 异常捕获原理

被拦截的方法需显式抛出异常,并不能经任何处理,这样 aop 代理才能捕获到方法的异常,才能进行回滚,默认情况下 aop 只捕获 RuntimeException 的异常,但可以通过配置来捕获特定的异常并回滚。

换句话说在 service 的方法中不使用 try{}catch{} 或者在 catch 中最后加上 throw new RuntimeExcetpion();,这样程序异常时才能被 aop 捕获进而回滚。

解决方案:

  1. 例如:service 层处理事务,那么 service 中的方法中不做异常捕获,或者在 catch 语句中最后增加 throw new RuntimeException() 语句,以便让 aop 捕获异常再去回滚,并且在 service 上层(controller 层)要继续捕获这个异常并处理。
  2. 在 service 层方法的 catch 语句中增加:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

手动回滚,这样上层就无需去处理异常。

相关文章

  • Spring事务

    先说结论:Spring事务异常回滚,捕获异常不抛出就不会回滚。最近遇到了事务不回滚的情况,我还考虑说JPA的事务有...

  • Spring事务异常回滚

    默认 spring 事务只在发生未被捕获的 RuntimeExcetpion 时才会回滚。 类似这样的方法不会回滚...

  • 事务异常回滚

    在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注...

  • Spring学习笔记(五)-事务的管理

    1.Spring的事务提交回滚 (1).运行期抛出的异常,spring会将事务回滚也就是(uncheck的异常) ...

  • 二十、spring事务之回滚事务

    Spring事务信息准备好后,如果我们的程序出现了异常,又会如何回滚事务呢?这节我们分析Spring事务回滚原理。...

  • 手写源码(一):自己实现Spring事务

    手写Spring事务 Spring事务分为声明式事务(注解或包扫描)和编程式(在代码里提交或回滚)事务,声明式事务...

  • SpringBoot事务回滚问题

    SpringBoot事务不回滚问题 Spring声明式事务管理默认对 非检查型异常 或 运行时异常 进行事务回滚,...

  • (四)Spring事务管理接口的介绍

    Spring 事务管理接口说明所谓事务管理,其实就是“按照给定的事务规则来执行提交或者回滚操作”。Spring 框...

  • pringMVC事务回滚

    事务回滚机制 默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。 如果不写rool...

  • SpringBoot 事务回滚问题排查

    公司遇到一个问题,同样的代码不同机器打包出现事务回滚和不回滚,而每次本地调试事务均能生效。 spring事务配置 ...

网友评论

      本文标题:Spring事务异常回滚

      本文链接:https://www.haomeiwen.com/subject/dtpcqqtx.html