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注解都无法生效,设置传播行为更是无任何意义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1189504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想入行网络安全?这份零基础入门指南,帮你避开90%的常见学习误区。

网络安全入门全攻略:零基础也能快速上手,建议收藏 网络安全行业人才缺口大,新手可快速入门。建议先建立"安全思维",不必一开始就敲复杂代码。有两个核心方向:合规与安全运维(适合技术敏感度一般…

2026年聚乙二醇6000粉末厂家权威推荐榜:聚乙二醇6000粉末、聚乙二醇8000、聚乙二醇8000粉末、聚乙二醇10000粉末选择指南 - 优质品牌商家

江苏诚信聚乙二醇6000粉末供应商推荐榜一、聚乙二醇6000粉末行业背景与筛选逻辑据《2026年中国聚醚衍生物行业发展白皮书》数据显示,国内聚乙二醇6000粉末市场需求年增长率达8.3%,其中日用化学品、油田化学品领域占比…

【实战项目】 基于Flutter的新闻资讯APP开发

运行效果:https://lunwen.yeel.cn/view.php?id=5843 基于Flutter的新闻资讯APP开发摘要:随着移动互联网的快速发展,Flutter作为一种新兴的跨平台开发框架,因其高效、易用等特点在移动应用开发领域受到广泛关注。本…

2026年水性联线高光光油厂家选哪家?汇华科技用性能与口碑给出答案 - 博客万

2026年印刷企业的四大痛点:高光、耐磨、环保、效率如何平衡? 2026年,随着环保政策的持续收紧(欧盟、中国等均升级VOC限制法规)和高端包装需求的爆发(食品、烟包等领域高端礼盒订单占比提升至50%),印刷企业正面…

RAG不是万能的:没有可观测性,你的系统只是在“碰运气”

前言RAG(Retrieval-Augmented Generation)技术在过去两年迅速成为企业落地大模型应用的首选架构。它通过将私有知识库与大语言模型深度融合,在提升回答准确性的同时,有效抑制了模型幻觉,为高风险场景提供了可信保障。然…

js 并发任务

class TaskParallel{constructor(parallelcount=2){this.parallelcount=parallelcount;this.tasks=[];this.runningCount=0;}add(task){return new Promise((resolve,reject)=>{this.tasks.push({task,resolve,reje…

【实战项目】 边缘计算设备的安全启动

运行效果:https://lunwen.yeel.cn/view.php?id=5844 边缘计算设备的安全启动摘要:随着物联网技术的发展,边缘计算设备在各个领域得到广泛应用。然而,边缘计算设备的安全启动问题日益凸显,对设备的安全稳定运行构…

EasyGBS算法算力平台:园区全域智能安防监控体系方案设计

在数字化浪潮席卷各行各业的今天,园区的安防需求变得日益复杂,传统园区安防系统正面临前所未有的挑战与机遇。如何将分散的视频资源整合为统一的智能安防网络?如何让监控系统从“看得见”到“看得懂”?作为一款视频监控平台,Easy…

2026年诚信的医疗周转箱,周转箱过滤,定制周转箱厂家采购选型指南 - 品牌鉴赏师

引言在 2026 年的今天,医疗行业对于周转箱的需求日益增长,诚信的医疗周转箱、周转箱过滤以及定制周转箱等产品成为了市场关注的焦点。为了帮助广大采购商在众多的周转箱厂家中做出更科学、合理的选型决策,我们依据相…

EasyGBS构筑智慧城市智能可视化监控新生态

在智慧城市建设向深水区推进的过程中,视频监控作为城市感知网络的核心组成,正面临着设备异构、平台孤岛、智能应用落地难等核心痛点。国标GB28181协议的普及为设备互联互通提供了统一标准,而EasyGBS算法算力平台则以"协议兼容算力调度智…

寒假做题记录

1.20 Tue LG P1522 牧场:联通的牧区;牧场的直径:任意两个牧区的距离(最短路)的最大值;目的是连接两个牧场,使得新的大牧场的直径最小,输出的新的直径 1.肯定先求连通块 2.\(N\leq 150\) 且要求任意两个点之间的…

数据资产地图 × 全行业适用的智能数据治理解决方案

一、概要|以数据资产地图为核心,推动分类分级真正落地见效提示:在数据要素成为核心生产要素的时代,数据分类分级必须从“合规任务”走向“治理引擎”。 在数字经济高速发展的背景下,数据已成为驱动组织运转和业务创新的…

跨越x86与ARM:openEuler全架构算力实战评测 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

家庭公共WiFi安全终极指南:从密码设置到防蹭网的保姆级防护攻略

简介:WiFi密码破解是一个技术性的话题,涉及网络安全和无线通信。了解WiFi网络的基本安全原理对于保护个人网络安全至关重要。本指南介绍了WiFi网络的安全协议,如何使用Aircrack-ng工具集进行安全测试,并详细说明了WiFi密码破解的步…

精密制造必备!国内优秀CNC 2.5次元供应商推荐清单 - 品牌推荐大师

在精密制造、模具加工、五金电子以及汽车零部件等行业,CNC 2.5次元影像测量仪已然成为品质管控的关键设备。它巧妙融合了光学成像与数控移动平台的优势,能够高效自动测量二维轮廓、尺寸公差、形位偏差等重要参数。不…

网络安全审计核心流程全解析:从日志收集到风险报告的关键指标与实践

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

配标仪真实测评榜:哪个品牌好?耐用性+性价比大比拼 - 品牌推荐大师1

在实验室自动化设备中,配标仪(也称自动液体处理工作站或稀释配标系统)是提升检测效率、保障数据重复性的关键装备。随着国产替代加速,越来越多的科研机构、第三方检测实验室和药企开始关注国产品牌。本文将从专业测…

以数据化能力推动安全治理落地生效的智能引擎

一、概要|用数据化成果验证分类分级的真实价值提示:数据分类分级的价值,最终要体现在“看得见、用得上、落得下”的成效上。 在数字经济全面深化的背景下,数据已成为企业最核心的生产要素之一。知源-AI数据分类分级产品以“数据化…

什么是UI自动化测试?什么项目适合做UI自动化测试?

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快本文主要分享做简单的UI自动化测试简介、为何要做UI自动化测试、什么情况下适合做UI自动化测试以及其他的心得体会,希望能给各位同行带来思想上的碰撞。…

混淆矩阵入门

混淆矩阵从入门到精通教程 本教程面向机器学习初学者,从核心概念、公式推导到实战案例,循序渐进讲解混淆矩阵的使用方法,结合工业场景(石油、燃气)和通用场景,每个案例都完整计算准确率、精确率、召回率、F…