首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Spring Boot 事务管理入门

Spring Boot 事务管理入门

作者头像
艾伦耶格尔
发布2025-08-28 14:46:40
发布2025-08-28 14:46:40
2180
举报
文章被收录于专栏:Java基础Java基础

在 Spring Boot 应用中,事务管理是一个至关重要的方面,它确保了数据的一致性和完整性。本文将深入探讨 Spring Boot 中事务管理的机制、使用方法以及注意事项,并提供丰富的示例代码。

其它教程:

mysql事务详解

一、事务基础概念

事务是一组数据库操作,这些操作要么全部成功执行,要么全部回滚,以保持数据的一致性。事务具有四个关键特性,通常称为 ACID 属性:

  • 原子性 (Atomicity): 事务是一个不可分割的工作单元,所有操作要么全部完成,要么全部不执行。
  • 一致性 (Consistency): 事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  • 隔离性 (Isolation): 多个事务并发执行时,一个事务的执行不应受其他事务的干扰。
  • 持久性 (Durability): 一旦事务提交,其对数据库的修改应该是永久性的,即使系统发生故障也不会丢失。
二、Spring Boot 事务管理方式

Spring Boot 简化了事务管理的配置,主要有两种方式:

  1. 声明式事务管理: 使用注解 @Transactional 是最常用的方式,它允许你通过简单的注解配置事务行为。
  2. 编程式事务管理: 使用 TransactionTemplate 或 PlatformTransactionManager 手动控制事务的开启、提交和回滚。 声明式事务更简洁易用,而编程式事务提供更细粒度的控制。
三、@Transactional 注解详解

@Transactional 注解可以应用于类级别或方法级别。应用于类级别时,所有公共方法都将具有事务性。应用于方法级别时,只有该方法具有事务性。

常用属性:

  • propagation: 事务传播行为,定义了当一个事务方法调用另一个事务方法时,如何处理事务。
    • REQUIRED (默认): 如果当前存在事务,则加入该事务;否则,创建一个新事务。
    • REQUIRES_NEW: 总是创建一个新事务,即使当前存在事务。
    • SUPPORTS: 如果当前存在事务,则加入该事务;否则,以非事务方式执行。
    • NOT_SUPPORTED: 以非事务方式执行操作,即使当前存在事务。
    • MANDATORY: 要求当前存在事务,否则抛出异常。
    • NEVER: 要求当前不存在事务,否则抛出异常。
    • NESTED: 如果当前存在事务,则创建一个嵌套事务;否则,创建一个新事务。
  • isolation: 事务隔离级别,定义了事务之间的隔离程度。
    • DEFAULT: 使用数据库默认的隔离级别。
    • READ_UNCOMMITTED: 最低隔离级别,可能读取到未提交的数据(脏读)。
    • READ_COMMITTED: 只能读取已提交的数据。
    • REPEATABLE_READ: 可重复读,在同一个事务内多次读取同一数据,结果相同。
    • SERIALIZABLE: 最高隔离级别,事务串行执行,避免了所有并发问题,但性能较低。
  • rollbackFor: 指定哪些异常会导致事务回滚。 默认情况下,RuntimeException 和 Error 会导致回滚。
  • noRollbackFor: 指定哪些异常不导致事务回滚。
  • timeout: 事务超时时间,以秒为单位。
  • readOnly: 指定事务是否为只读事务。 只读事务可以提高性能。
四、示例代码
1. 声明式事务管理
代码语言:javascript
复制
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void registerUser(User user) {
        userRepository.save(user);
        // ...其他操作...  如果发生异常,事务会回滚
    }
}
2. 编程式事务管理 (使用 TransactionTemplate)
代码语言:javascript
复制
@Service
public class OrderService {

    @Autowired
    private TransactionTemplate transactionTemplate;

    @Autowired
    private OrderRepository orderRepository;

    public void createOrder(Order order) {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                try {
                    orderRepository.save(order);
                    // ...其他操作...
                } catch (Exception e) {
                    status.setRollbackOnly(); // 手动回滚事务
                    throw new RuntimeException("创建订单失败", e);
                }
            }
        });
    }

}
五、注意事项
  • @Transactional 注解只能应用于 public 方法。
  • 默认情况下,只有运行时异常 (RuntimeException) 才会导致事务回滚。 需要回滚 checked exception,需要显式指定 rollbackFor 属性.
  • 事务方法互相调用时,需要注意事务传播行为。
  • 避免在事务方法中进行耗时操作,以免影响性能。
六、总结

Spring Boot 提供了灵活且易于使用的事务管理机制,可以有效地保证数据的一致性和完整性。 通过合理地配置事务属性,可以更好地控制事务行为,提高应用程序的可靠性和性能。 理解事务的 ACID 属性和 Spring Boot 的事务管理方式,是开发健壮应用程序的关键。希望对各位看官有所帮助,下期见,谢谢~

其它教程:事务管理进阶

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、事务基础概念
  • 二、Spring Boot 事务管理方式
  • 三、@Transactional 注解详解
  • 四、示例代码
    • 1. 声明式事务管理
    • 2. 编程式事务管理 (使用 TransactionTemplate)
  • 五、注意事项
  • 六、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档