SpringBoot手动提交/回滚事务实现方式

 更新时间:2026年05月17日 10:07:44   作者:一直到老到直一  
在SpringBoot中,推荐使用`@Transactional`注解进行声明式事务管理,但在某些情况下,可能需要手动控制事务,可通过`TransactionTemplate`或编程式事务管理来实现,涉及获取事务管理器、开始事务、执行操作、提交或回滚事务,通常建议使用声明式事务管理,除非有特殊需求

在Spring Boot中,通常推荐使用声明式事务管理(即使用@Transactional注解)来自动处理事务的开启、提交和回滚。然而,在某些情况下,可能需要更细致地控制事务的边界,这时可能需要手动提交或回滚事务。

虽然Spring Boot本身不直接提供“手动”提交或回滚事务的API(因为Spring的PlatformTransactionManager接口被设计为抽象层,隐藏了具体事务实现的细节),但可以通过操作底层资源(如TransactionTemplateTransactionStatus)或使用编程式事务管理来间接实现这一点。

使用TransactionTemplate

TransactionTemplate提供了一种模板方法,允许在回调中执行数据库操作,并且可以配置事务的属性(如隔离级别、传播行为等)。然而,它并不直接提供“手动”提交或回滚事务的API,因为它会在回调方法执行完毕后自动提交事务(如果没有抛出异常),或者在抛出异常时自动回滚事务。

下面是一个使用 TransactionTemplate 的示例:

首先,需要在 Spring 配置中定义 TransactionTemplate bean(如果使用的是基于 Java 的配置,可以通过 @Bean 注解来定义):

@Configuration  
@EnableTransactionManagement  
public class TransactionConfig {  
  
    @Autowired  
    private PlatformTransactionManager transactionManager;  
  
    @Bean  
    public TransactionTemplate transactionTemplate() {  
        return new TransactionTemplate(transactionManager);  
    }  
}

然后,在服务类中注入 TransactionTemplate 并使用它:

@Service  
public class YourService {  
  
    @Autowired  
    private TransactionTemplate transactionTemplate;  
  
    @Autowired  
    private YourRepository yourRepository; // 假设你有一个Repository  
  
    public void performDatabaseOperations() {  
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {  
            @Override  
            protected void doInTransactionWithoutResult(TransactionStatus status) {  
                try {  
                    // 在这里执行数据库操作  
                    yourRepository.saveSomething();  
                    // 可以继续执行其他数据库操作...  
  
                    // 如果一切正常,TransactionTemplate会自动提交事务  
                    // 不需要手动调用status.commit();  
  
                } catch (RuntimeException ex) {  
                    // 如果捕获到异常,可以选择回滚事务  
                    // 注意:在TransactionCallbackWithoutResult中,通常不需要显式调用status.rollback();  
                    // 因为TransactionTemplate默认会在回调方法抛出异常时回滚事务  
                    // 但如果你想在回滚之前执行一些清理操作,可以在这里处理  
                    // 然后重新抛出异常,让TransactionTemplate知道需要回滚  
                    throw ex; // 重新抛出异常  
                }  
            }  
        });  
    }  
}

编程式事务管理

如果确实需要更细粒度的控制,可以通过PlatformTransactionManager接口来编程式地管理事务。这通常涉及以下几个步骤:

  • 获取事务管理器:首先,需要获取PlatformTransactionManager的实例。这通常是通过依赖注入来完成的。
  • 开始事务:使用事务管理器的getTransaction方法开始一个新的事务,该方法返回一个TransactionStatus对象,该对象代表了当前事务的状态。
  • 执行数据库操作:在事务的上下文中执行你的数据库操作。
  • 提交或回滚事务:根据数据库操作的结果,可以调用TransactionStatus对象的commit方法来提交事务,或者在捕获到异常时调用rollback方法来回滚事务。

示例

以下是一个简单的示例,展示了如何在Spring Boot服务中编程式地管理事务:

@Service  
public class YourService {  
  
    @Autowired  
    private PlatformTransactionManager transactionManager;  
  
    @Autowired  
    private YourRepository yourRepository; // 假设你有一个Repository  
  
    public void yourMethod() {  
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();  
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);  
  
        TransactionStatus status = transactionManager.getTransaction(def);  
  
        try {  
            // 执行数据库操作  
            yourRepository.someDatabaseOperation();  
  
            // 提交事务  
            transactionManager.commit(status);  
        } catch (RuntimeException e) {  
            // 回滚事务  
            transactionManager.rollback(status);  
            throw e; // 可以选择重新抛出异常  
        }  
    }  
}

注意

虽然上述代码展示了如何在Spring Boot中编程式地管理事务,但在实际开发中,除非有特别的需求,否则通常建议使用声明式事务管理(即@Transactional注解),因为它更简单、更易于维护,并且与Spring的集成更加紧密。

此外,如果业务逻辑非常复杂,需要跨多个服务或方法边界控制事务,那么可能需要考虑使用分布式事务解决方案,如Spring Cloud Alibaba的Seata等。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java局部变量线程安全原理分析

    Java局部变量线程安全原理分析

    这篇文章主要介绍了Java局部变量线程安全原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java ArrayList中的remove方法介绍

    java ArrayList中的remove方法介绍

    大家好,本篇文章主要讲的是java ArrayList中的remove方法介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • ThreadLocal作用原理与内存泄露示例解析

    ThreadLocal作用原理与内存泄露示例解析

    这篇文章主要为大家介绍了ThreadLocal作用原理与内存泄露示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 新手了解java 异常处理基础知识

    新手了解java 异常处理基础知识

    Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。那么这篇文章总结了Java有效处理异常的三个原则,有需要的朋友们可以参考借鉴
    2021-07-07
  • Spring Boot 日志级别及配置详解

    Spring Boot 日志级别及配置详解

    本文讲解SpringBoot日志核心:通过slf4j记录日志,支持多级别(INFO/DEBUG/TRACE)及配置输出格式、路径、分割策略,便于问题定位和数据分析,同时结合Lombok简化日志代码,强调日志持久化与安全审计的重要性,感兴趣的朋友一起看看吧
    2025-07-07
  • Java自旋锁与读写锁的实现原理

    Java自旋锁与读写锁的实现原理

    本文介绍了Java中的自旋锁和读写锁,自旋锁是一种非阻塞锁,适用于锁持有时间极短的场景,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2026-02-02
  • SpringBoot处理接口幂等性的两种方法详解

    SpringBoot处理接口幂等性的两种方法详解

    接口幂等性处理算是一个非常常见的需求了,我们在很多项目中其实都会遇到。本文为大家总结了两个处理接口幂等性的两种常见方案,需要的可以参考一下
    2022-06-06
  • Spring实现Bean的初始化和销毁的方式

    Spring实现Bean的初始化和销毁的方式

    这篇文章主要介绍了Spring实现Bean的初始化和销毁的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Java注解简单使用实例解析

    Java注解简单使用实例解析

    这篇文章主要介绍了Java注解简单使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • ssm开发使用redis作为缓存的使用步骤

    ssm开发使用redis作为缓存的使用步骤

    在开发中经常遇到大量的重复的,高并发的查询,此时可以使用redis缓存。这篇文章主要介绍了ssm开发使用redis作为缓存的使用步骤,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论