通过Spring层面进行事务回滚的实现

 更新时间:2025年04月14日 10:14:36   作者:我只有一岁半  
本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下

Spring 中事务可以分为声明式事务和编程式事务,那么解下来就从这两方面说一说在 Spring 层面个怎么进行回滚

声明式事务回滚:

1. 基础注解配置

通过@Transactional注解实现自动回滚,默认对RuntimeException和Error生效

@Transactional
public void transferMoney(Account from, Account to, double amount) {
    from.withdraw(amount);  // 扣款
    to.deposit(amount);     // 存款
    // 若在此处抛出RuntimeException,事务自动回滚
}

2. 指定回滚异常类型

可以通过 @Transactional 注解的 rollbackFor 参数扩展回滚范围到受检异常

@Transactional(rollbackFor = {SQLException.class, BusinessException.class})
public void processOrder(Order order) throws CustomException {
    // 抛出SQLException或BusinessException时回滚
}

需要显示声明受检查异常类型,否则不会滚

3. ​不回滚特殊场景

使用 noRollbackFor 参数排除特定异常

@Transactional(noRollbackFor = {ValidationException.class})
public void validateData(Data data) {
    // ValidationException不会触发回滚
}

编程式事务回滚:

1. ​使用 TransactionTemplate 实现编程式事务

@Autowired
private TransactionTemplate transactionTemplate;

public void batchProcess() {
    transactionTemplate.execute(status -> {
        try {
            // 业务操作...
            if (errorCondition) status.setRollbackOnly();
            return result;
        } catch (Exception e) {
            status.setRollbackOnly();
            throw e;
        }
    });
}

2. 使用 ​PlatformTransactionManager 实现编程式事务

直接操作事务管理器实现完全控制

@Autowired
private PlatformTransactionManager transactionManager;

public void complexOperation() {
    TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    try {
        // 业务操作...
        transactionManager.commit(status);
    } catch (Exception e) {
        transactionManager.rollback(status);
        throw new ServiceException("操作失败", e);
    }
}

嵌套事务与传播行为相关的异常回滚:

1. 嵌套事务(PROPAGATION_NESTED)

子事务作为父事务的保存点,可部分回滚

@Transactional(propagation = Propagation.REQUIRED)
public void parentMethod() {
    // 主业务逻辑
    childMethod();  // 嵌套子事务
}

@Transactional(propagation = Propagation.NESTED)
public void childMethod() {
    // 子事务操作,失败仅回滚子操作
}

2.传播行为控制

通过传播策略控制事务边界:
REQUIRES_NEW:始终新建事务
MANDATORY:必须存在父事务
NOT_SUPPORTED:非事务执行

通过 xml 的方式配置全局回滚规则:

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="save*" rollback-for="java.lang.Exception"/>
        <tx:method name="update*" no-rollback-for="BusinessWarning"/>
    </tx:attributes>
</tx:advice>

到此这篇关于通过Spring层面进行事务回滚的实现的文章就介绍到这了,更多相关Spring事务回滚内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Spring Boot入门(web+freemarker)

    Spring Boot入门(web+freemarker)

    这篇文章主要介绍了Spring Boot入门(web+freemarker)的相关资料,需要的朋友可以参考下
    2017-06-06
  • SpringBoot+logback默认日志的配置和使用方式

    SpringBoot+logback默认日志的配置和使用方式

    这篇文章主要介绍了SpringBoot+logback默认日志的配置和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java阻塞队列BlockingQueue详解

    Java阻塞队列BlockingQueue详解

    这篇文章主要介绍了Java阻塞队列BlockingQueue,文章通过队列的类型展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • springboot ElasticSearch如何配置自定义转换器ElasticsearchCustomConversions

    springboot ElasticSearch如何配置自定义转换器ElasticsearchCustomConver

    这篇文章主要介绍了springboot ElasticSearch如何配置自定义转换器ElasticsearchCustomConversions问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • java使用socket实现一个多线程web服务器的方法

    java使用socket实现一个多线程web服务器的方法

    今天小编就为大家分享一篇java使用socket实现一个多线程web服务器的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 详解Java线程中断知识点

    详解Java线程中断知识点

    在本篇文章中我们给大家分享了关于Java线程中断的相关知识点内容以及相关代码实例,有兴趣的朋友们可以学习下。
    2018-09-09
  • Java AbstractMethodError原因案例详解

    Java AbstractMethodError原因案例详解

    这篇文章主要介绍了Java AbstractMethodError原因案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 理解java多线程中ExecutorService使用

    理解java多线程中ExecutorService使用

    这篇文章主要帮助大家理解java多线程中ExcetorServiced的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JavaWeb中异步交互的关键Ajax详解

    JavaWeb中异步交互的关键Ajax详解

    这篇文章主要给大家介绍了关于JavaWeb中异步交互关键Ajax的相关资料,在javaweb中,ajax是前后台交互的技术,可以实现异步请求,不用刷新整个页面就可以完成操作,需要的朋友可以参考下
    2023-07-07
  • 深入理解Java动态代理与静态代理

    深入理解Java动态代理与静态代理

    这篇文章主要介绍了深入理解Java动态代理与静态代理,静态代理,代理类和被代理的类实现了同样的接口,代理类同时持有被代理类的引用,动态代理的根据实现方式的不同可以分为JDK动态代理和CGlib动态代理
    2022-06-06

最新评论