news 2026/4/15 18:26:31

Spring Boot之@Transactional注解实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot之@Transactional注解实践

在Spring Boot大行其道的时代,开发者可以通过@Transactional注解来方便的操作事务

隔离级别

@Transactional注解的isolation属性,可用来设置隔离级别。默认值为Isolation.DEFAULT。该属性可选值有:

  • Isolation.DEFAULT:数据源默认隔离级别
  • Isolation.READ_UNCOMMITTED:未提交读
  • Isolation.READ_COMMITTED:已提交读
  • Isolation.REPEATABLE_READ:可重复读
  • Isolation.SERIALIZABLE:串行化

回滚条件

@Transactional注解默认只会对RuntimeException、Error及其子类进行回滚。如果期望对检查异常进行回滚,可通过rollbackFor、rollbackForClassName属性添加新的回滚条件

// 方式1: 支持对所有异常类型进行回滚 @Transactional(rollbackFor = Exception.class) // 方式2:支持对所有异常类型进行回滚 @Transactional(rollbackForClassName = {"Exception"})

类似地,还可以排除某些异常,使之不发生回滚

// 方式1: 抛出ArithmeticException异常不进行回滚 @Transactional(noRollbackForClassName = {"ArithmeticException"} ) // 方式2: 抛出ArithmeticException异常不进行回滚 @Transactional(noRollbackFor = {ArithmeticException.class} )

上述四种回滚条件的属性对指定异常的子类也是生效的

只读事务

@Transactional注解的readOnly属性默认为false,如需只读事务可将其配置为true。在只读事务中不允许执行读之外操作,否则事务将会回滚

事务传播行为

@Transactional注解的propagation属性可用来设置事务传播行为,默认值为Propagation.REQUIRED。其用来表示当一个事务传播行为修饰的方法(即methodB)被另一个方法(即methodA)调用时,事务如何进行传播

public class ServiceA { public void methodA() { ... serviceB.methodB(); ... } } ... public class ServiceB { // 通过propagation属性指定methodB方法的事务传播行为 @Transactional(propagation = ...) public void methodB() { ... } }

Propagation.REQUIRED

支持当前事务;如果当前没有事务,则新建一个事务。如下图所示。这也是日常开发中最常使用的配置。在Case 1的场景下,无论methodA方法还是methodB方法出现异常,均会进行回滚,因为它们是在同一个事务中

Propagation.REQUIRES_NEW

新建事务;如果当前存在事务,则把当前事务挂起。如下图所示。以Case 1为例进行分析,由于methodA、methodB方法使用的是两个不同的事务,故当methodB方法提交后,即使methodA方法失败回滚了,也不会导致methodB方法出现回滚。当methodB方法失败回滚后,如果methodA未捕获methodB所抛出的异常,导致methodA继续抛出该异常则methodA方法也会被回滚;如果methodA方法捕获methodB所抛出的异常,则methodA所在的事务还是有可能提交成功的

Propagation.SUPPORTS

支持当前事务;否则将非事务方式执行。如下图所示

Propagation.MANDATORY

支持当前事务;否则将抛出IllegalTransactionStateException异常,此时不仅methodB方法无法得到执行,也会打断methodA方法的执行流程,除非在methodA方法中捕获处理该异常。如下图所示

Propagation.NOT_SUPPORTED

不支持当前事务,而是始终以非事务的方式执行。如下图所示

Propagation.NEVER

以非事务方式执行;如果当前存在事务,则抛出IllegalTransactionStateException异常,此时不仅methodB方法无法得到执行,还会打断methodA方法的执行流程,甚至导致methodA方法发生回滚

Propagation.NESTED

如果当前存在事务,则对于该传播行为修饰的方法会依然使用当前事务,这样一旦methodA方法进行回滚,则methodB方法也会进行回滚。但由于该传播行为是通过数据库事务的保存点进行实现的,那么一旦methodB方法抛出异常发生回滚。如果methodA方法捕获了methodB方法所抛出的异常,则methodA就不会因此而回滚;而methodA方法如果继续向上抛出异常则其也会被回滚;如果当前没有事务,则新建一个事务。如下图所示

Note

  1. 事务注解只会对public方法生效

当@Transactional事务注解添加在类上,表示其将作用于该类中的所有public方法

  1. 通过类内部调用事务方法,事务无法生效

例如下面代码所示,在A类内部通过一个普通方法methodA调用事务方法methodB,那么methodB的事务会生效么?

public class A { public void methodA() { ... methodB(); ... } @Transactional public void methodB() { ... } }

答案是,原因很简单。这里我们将Spring AOP后的动态代理类ProxyA用伪代码的形式给出,如下所示。可以看到,虽然动态代理类ProxyA中的methodB方法被加入了事务切面。但事实上调用ProxyA的methodA方法后,会直接进入目标类A中,即执行a.methodA()方法,然后直接调用A类中的methodB方法。换言之,methodB方法没有通过代理类ProxyA进行调用,自然其事务注解不会生效

public class ProxyA { private A a = new A(); public void methodA() { // 执行目标方法 a.methodA(); } public void methodB() { // 前置增强 ... // 执行目标方法 a.methodB(); // 后置增强 ... } }

即使在A类的methodA上也添加@Transactional事务注解,methodB方法由于没走代理类ProxyA,故methodB方法依然还是使用methodA方法的事务。即使将methodB方法的传播行为设置为Propagation.REQUIRES_NEW,也不会重新开启一个新的事务。因为methodB方法连@Transactional注解都无法生效,设置传播行为更是无任何意义

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/7 17:36:19

网络安全审计高效指南:手把手教你利用常用工具发现潜在威胁与漏洞

网络安全审计是一种检查和评估网络安全控制措施、策略和程序的有效性的过程。网络安全审计的目标是识别网络中可能存在的安全漏洞,以及制定改进计划以提高网络安全。 1. 网络安全审计的重要性 网络安全审计有助于保护组织的信息资产,防止数据泄露&…

作者头像 李华
网站建设 2026/4/6 0:28:58

2026年1月房产中介管理系统使用体验评测

在房产中介行业数字化转型加速的当下,一款高效实用的房产中介管理系统,能为经纪公司降本增效、提升成交率提供核心支撑。无论是夫妻店、小型团队还是连锁企业,都需依托系统实现房客源、办公流程、营销获客的规范化管理。本次评测精选4款主流房…

作者头像 李华
网站建设 2026/4/2 7:22:20

【改进差分优化算法JaDE】差分进化算法(DE)及其变体自适应权重差分进化算法(JaDE)在CEC2005函数寻优的对比研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/4/14 9:30:58

收藏!35+程序员转行大模型全攻略:从入门到求职落地,少走90%弯路

在技术迭代日新月异的当下,大模型领域凭借其广阔的应用场景、持续攀升的市场需求以及极具吸引力的薪资待遇,已然成为程序员群体转型的热门优选赛道。对于35岁以上的程序员而言,尽管面临着精力分配失衡、技术代际断层、职场竞争加剧等现实挑战…

作者头像 李华
网站建设 2026/4/8 16:09:55

收藏!大模型压缩核心技术全解析(含组合优化流程)

本文将系统拆解大模型压缩的三大核心技术,详细说明剪枝(移除冗余连接)、量化(降低数值精度)与知识蒸馏(教师-学生模式)的原理、分类及实操要点,并给出经实践验证的“知识蒸馏→剪枝→…

作者头像 李华
网站建设 2026/4/12 0:21:18

告别 PPT 熬夜魔咒!宏智树 AI 一键生成学术职场双高分演示文稿

还在为开题报告 PPT 逻辑混乱发愁?还在为论文答辩 PPT 数据排版抓狂?还在为工作汇报 PPT 颜值不够焦虑?作为深耕论文写作科普的教育博主,我实测多款工具后发现,宏智树 AI 科研工具的 AI PPT 功能,堪称学术人…

作者头像 李华