Spring Boot 中的事务管理:默认配置、失效场景及集中配置

news/2025/2/14 0:34:45/

Spring Boot 提供了强大的事务管理功能,基于 Spring 的 @Transactional 注解。本文将详细介绍事务的默认配置、事务失效的常见场景、以及事务的几种集中配置方式,并给出相应的代码片段。


一、事务的默认配置

在 Spring Boot 中,默认情况下,事务管理器会自动配置一个 DataSourceTransactionManager,前提是项目中已经配置了一个数据源(DataSource)。以下是一些默认行为:

  1. 传播行为

    1. 默认传播行为是 Propagation.REQUIRED,即如果当前存在事务,则加入该事务;否则创建一个新的事务
  2. 隔离级别

    • 默认隔离级别是 Isolation.DEFAULT,即使用底层数据库的默认隔离级别。
  3. 回滚规则

    • 默认情况下,只有未捕获的 RuntimeExceptionError 会触发事务回滚。
    • 检查型异常(Checked Exception)不会触发回滚。
  4. 只读属性

    • 默认情况下,事务不是只读的。
  5. 超时时间

    • 默认没有设置超时时间。

二、事务失效的常见场景

尽管 @Transactional 注解非常方便,但在某些情况下,事务可能不会按预期工作。以下是常见的事务失效场景:

1. 方法为 privatefinal

  • Spring 的事务管理是基于 AOP 实现的,AOP 使用动态代理来拦截方法调用。如果方法是 privatefinal,则无法被代理,事务将失效。
@Service
public class UserService {@Transactionalprivate void updateUser() {// 这里的事务不会生效}
}

2. 同一个类中的方法调用

如果在一个类中,一个非事务方法调用了一个带有 @Transactional 注解的方法,事务也不会生效。因为代理对象不会拦截内部方法调用。

@Service
public class UserService {public void outerMethod() {innerMethod(); // 这里事务不会生效}@Transactionalpublic void innerMethod() {// 事务逻辑}
}

3. 异常被捕获

如果在事务方法中捕获了异常并处理了它,事务不会回滚。

@Service
public class UserService {@Transactionalpublic void updateUser() {try {// 业务逻辑throw new RuntimeException("Error");} catch (Exception e) {// 异常被捕获,事务不会回滚}}
}

4. 事务方法抛出检查型异常

默认情况下,只有未捕获的 RuntimeExceptionError 会触发回滚。如果事务方法抛出的是检查型异常(Checked Exception),事务不会回滚

@Service
public class UserService {@Transactionalpublic void updateUser() throws IOException {throw new IOException("Checked Exception"); // 不会触发回滚}
}

 

三、事务的集中配置及使用场景

Spring Boot 提供了多种事务配置方式,可以根据不同的需求进行选择。

1. 基于注解的事务配置

这是最常见的事务配置方式,使用 @Transactional 注解即可。

使用场景:

简单的事务管理,适用于大多数业务场景。

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void createUser(User user) {userRepository.save(user);if (user.getName().equals("error")) {throw new RuntimeException("Simulated error");}}
}

 2. 基于 XML 配置的事务管理

虽然 Spring Boot 推荐使用注解,但仍然可以通过 XML 配置事务管理。

使用场景

适用于遗留系统或需要更细粒度控制的场景。

<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="create*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="*" read-only="true"/></tx:attributes>
</tx:advice><aop:config><aop:pointcut id="serviceOperation" expression="execution(* com.example.service.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>

 3. 编程式事务管理

通过 TransactionTemplate 手动控制事务

使用场景:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED, timeout = 10)public void createUser(User user) {userRepository.save(user);}@Transactional(readOnly = true)public List<User> getAllUsers() {return userRepository.findAll();}
}

四、总结 

Spring Boot 提供了灵活且强大的事务管理机制,默认配置可以满足大部分场景的需求。但在实际开发中,需要注意事务失效的常见场景,并根据业务需求选择合适的事务配置方式。

  • 默认配置 :适用于大多数简单场景。
  • 失效场景 :注意方法访问修饰符、异常处理、同一类方法调用等问题。
  • 集中配置 :可以根据需求选择注解、XML、编程式或自定义事务属性的方式。

http://www.ppmy.cn/news/1571829.html

相关文章

TCP/IP 协议图解 | TCP 协议详解 | IP 协议详解

注&#xff1a;本文为 “TCP/IP 协议” 相关文章合辑。 未整理去重。 TCP/IP 协议图解 退休的汤姆 于 2021-07-01 16:14:25 发布 TCP/IP 协议简介 TCP/IP 协议包含了一系列的协议&#xff0c;也叫 TCP/IP 协议族&#xff08;TCP/IP Protocol Suite&#xff0c;或 TCP/IP Pr…

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域&#xff0c;运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌&#xff0c;安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景&#xff0c;正在为智能制造注入强劲动力&#xff01; MP3100&#xff1a;主板型运动控制…

数据可视化:让数据讲故事的力量

数据可视化&#xff1a;让数据讲故事的力量 在大数据时代&#xff0c;数据无处不在。每天&#xff0c;我们都在生成和消耗大量的数据。但仅有数据本身并不足够&#xff0c;我们需要一种方式将这些数据转化为有意义的信息&#xff0c;这就是数据可视化的力量所在。通过数据可视…

AI前端开发:赋能开发者,提升解决实际问题的能力

近年来&#xff0c;人工智能技术飞速发展&#xff0c;深刻地改变着各行各业。在软件开发领域&#xff0c;AI写代码工具的出现更是引发了一场革命&#xff0c;尤其是前端开发领域&#xff0c;AI的应用正在显著提升开发者的解决实际问题的能力。本文将探讨AI前端开发如何提升效率…

20250210解决WPS固定某一行在单元格在表头

20250210解决WPS固定某一行在单元格在表头 2025/2/10 16:56 缘起&#xff1a;需要处理锂电池的电池曲线【RK3566Android13】&#xff0c;需要固定处于表格中间的一行&#xff1a; 绝对时间 记录序号 相对时间(min) 状态 电流(mA) 电压(V) 容量(mAh) 能量(…

如何优化频繁跳槽后的简历?

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…

3.3 学习UVM中的uvm_driver 类分为几步?

文章目录 前言1. 定义2. 核心功能3. 适用场景4. 使用方法5. 完整代码示例5.1 事务类定义5.2 Driver 类定义5.3 Sequencer 类定义5.4 测试平台 6. 代码说明7. 总结 前言 以下是关于 UVM 中 uvm_driver 的详细解释、核心功能、适用场景、使用方法以及一个完整的代码示例&#xff…

算法兵法全略(译文)

目录 始计篇 谋攻篇 军形篇 兵势篇 虚实篇 军争篇 九变篇 行军篇 地形篇 九地篇 火攻篇 用间篇 始计篇 算法&#xff0c;在当今时代&#xff0c;犹如国家关键的战略武器&#xff0c;也是处理各类事务的核心枢纽。算法的世界神秘且变化万千&#xff0c;不够贤能聪慧…