@Transactional注解的方法之间调用事务是否生效及其他事务失效场景总结

2023-11-13

对于方法之间调用,注解@Transaction生效以及失效的场景

首先,我们需要知道,Spring是通过代理管理事务的,方法和方法之间的调用分为两种情况(解决办法可在下面列举的不同场景中自取):

1.不同类之间的方法调用。如类A的方法a()调用类B的方法b(),这种情况事务是正常起作用的。只要方法a()或b()配置了事务,运行中就会产生代理,开启事务。

注意,事务正常起作用是指注解的方法内事务操作生效,下面是两种典型场景实例:

如果是在A的方法a()上加@Transactional注解,那么先正常调用b()且b()有增删改操作,但是接着执行a()的动库操作异常,则两个方法内动库操作全部回滚;

如果A的方法a()没加@Transactional注解,而类B的方法b()上加了该注解,那么如果先正常执行中a()的动库操作,然后执行类B的方法b()的动库操作发生异常,那么b()中的事务操作会全部回滚,但是并不会影响先前a()中的操作,即b()中异常b()回滚,a()不回滚。

2.同一个类的不同方法之间的调用。以同类中方法a()调用方法b()为例:

1).方法a()开启了事务,事务正常生效

2).方法a()没有开启事务,此时调用方法b(),无论被调用的b()是否配置了事务,事务都不会生效

说明:在微服务架构中,很多方法里面会有各种跨库跨服务器操作,这时候你添加注解@Transactional就不会使事务生效了,我们会寻求Seata等其他技术方案解决分布式事务问题。

其他使用@Transactional注解失效的场景,需要注意:

1.方法是非public,其事务就会失效:

该注解一般标注在类或者public方法上,如果方法是非public,其事务就会失效

2.@Transactional 注解属性 propagation 设置错误

如果设置的事务传播行为是这三种,发生错误事务将不会回滚:

TransactionDefinition.PROPAGATION_SUPPORTS

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

TransactionDefinition.PROPAGATION_NEVER

3.try catch内部消化了:

如果在该注解标注的方法或被其调用的方法中有try catch,那么想要使得事务生效,一定要在catch中把异常直接抛出,如果不处理不向上抛出,则事务不会生效。

4.没有设置属性rollbackFor = Exception.class :

@Transactional只能回滚RuntimeException和RuntimeException下面的子类抛出的异常 不能回滚Exception异常!!!如果需要支持回滚Exception异常请用@Transactional(rollbackFor = Exception.class),如果是增删改的时候我建议大家都使用@Transactional(rollbackFor = Exception.class)。

5.数据库引擎不支持事务

常用的MySQL数据库默认使用支持事务的innodb引擎。一旦数据库引擎切换成不支持事务的myisam,那事务就从根本上失效了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Transactional注解的方法之间调用事务是否生效及其他事务失效场景总结 的相关文章

随机推荐

  • std::reverse_iterator::base()

    include
  • 小程序登录、微信网页授权(Java版)

    首先呢 登录 授权 授权登录 是一样的意思 不用纠结 写小程序授权登录的代码前 需要了解清楚openid与unionid的区别 这里再简单介绍一下 腾讯有个 微信 开放平台 只有企业才能注册账号 可理解为微信体系里 最顶级的账号 官网地址
  • 分享6个对象数组去重的方法

    大家好 关于对象数组去重的业务场景 想必大家都遇到过类似的需求吧 针对这样的需求 你是怎么做的呢 下面我就先和大家讨论下基于对象的某个属性如何去重 方法一 使用 filter 和 findIndex 相结合的方法 使用 filter 方法过
  • 程序员编程设计思维

    设计 设计工作 无论软件工程中的哪一个步骤 工作的开展都是为了解决一些实际问题 架构设计 子系统设计 功能模块设计 甚至类的设计 这些都是设计工作 原则 设计工作的开展是在一定的环境下进行 有很多的耳熟能详的规范或者原则 可扩展 高可用 高
  • 第五届河南省CCPC河南省省赛题解+复盘

    第五届河南省CCPC河南省省赛题解 复盘 今年省赛相当有意思的一点 是20级第一次线下省赛 对于部分队也可能是最后一次 看队名就能看出来很多 考研就业的选手 一群老年人在这PK 氛围挺不错 A 小水獭游河南 签到 这个题关键点就是 知道a串
  • pip常用功能汇总

    1 安装指定版本的package pip install keras 2 1 0 安装指定版本 2 升级package到指定版本 pip install upgrade keras 2 1 0 3 安装package到指定位置 pip in
  • Elasticsearch 的增删改查

    ES概念 Elasticsearch是一个开源的搜索引擎 分布式的实时文件存储 可以处理PB级结构化或非结构化数据 我们可以通过简单的RESTful API来完成各种操作 全文搜索 Full text Search 全文检索是指计算机索引程
  • 「考生说」不拼爹、不拼妈,拼自己,一样过的好

    哈佛图书馆凌晨四点半仍灯火通明 座无虚席 很多哈佛学生为了学业甚至通宵达旦的学习 球星科比的名言 你知道洛杉矶凌晨四点钟是什么样子吗 他们都能被称之为成功人士 但是他们依旧在大家看不见的地方默默努力着 那为什么我们依旧还在羡慕着那些拼爹 拼
  • pclpy有序点云的中值滤波:使用Python进行有序点云滤波

    pclpy有序点云的中值滤波 使用Python进行有序点云滤波 有序点云是一种在三维空间中按顺序存储的点集合 在许多应用中 需要对有序点云进行滤波以去除噪声和异常值 中值滤波是一个常用的方法 它可以有效地去除离群点 并且保持点云的形状不变
  • 寒假小复习4

    冒泡排序 public class Sort public static void main String args double nums 1 66 73 41 30 1 double temp for int i 0 i lt nums
  • 深入springMVC

    HTML 页面中的表单最初所采用 application x www form urlencode 编码方式 并不满足文件上传的需要 所以 RFC 1867 在此基础上增加了新的 multipart form data 编码方式以支持基于表
  • LRU算法(JAVA实现)

    一 算法介绍 最近最久未使用 Least Recently Used LRU 算法是 种缓存淘汰策略 它是大部分操作系统为最大化页面命中率而广泛采用的一种页面置换算法 该算法的思路是 发生缺页中断时 将最近一段时间内最久未使用的页面置换出去
  • Java static——拾遗

    Java static 拾遗 Java Static 作为修饰符 可以用来修饰变量 方法 代码块 但绝对不能修饰类 1 修饰变量 类的所有对象共同拥有的一个属性 也称为类变量 这类似于C语言中的全局变量 类变量在类加载的时候初始化 而且只被
  • Jenkins添加用户并授权

    添加用户 先选择系统管理1 再在右侧选择2 例如 注意 之后点击保存按钮 如果没有角色先去添加角色 设置完毕一般等待几分钟才可登录查看自己的功能权限 太早登录没任何功能
  • Excel下拉框样式

    1 打开要修改的Excel 选中要修改样式的单元格 2 在上边导航栏中选择 Data 找到 Data Validation 点击下面的 Data Validation 3 在设置中找到 Allow 项 选择 List Source中填写可供
  • 运行mvn -v后出现“cmd 不是内部或外部命令,也不是可运行的程序"

    1 下载maven 官网下载地址 http maven apache org download cgi 2 解压到软件安装目录 比如我解压到E java apache maven 3 5 0 bin apache maven 3 5 0 3
  • mysql中分组取创建时间最新的数据

    近期由于公司数据库升级 遇到了一个问题 以前写的SQL语句查询结果出现了异常 sql实现的功能 将数据以PID进行分组 在组内获取创建时间最新的数据 项目数据比较敏感写了一些测试数据 执行的sql语句 select from select
  • Android中使用jiecaovideoplayer播放视频

    每天学一点2020 5 13 Android 2 Android中使用jiecaovideoplayer播放视频 1 添加依赖 2 添加运行时的权限 3 布局 4 JCVideoPlayer使用 5 设置视频 Android中使用jieca
  • moviepy使用教程

    moviepy使用教程 一 剪辑成果 二 遇到问题 三 moviepy方法分享 一 音频剪辑方法 二 视频剪辑方法 一 剪辑成果 未来 二 遇到问题 尝试使用ffmpeg moviepy pydub 其中pydub主要是对音频的处理 mov
  • @Transactional注解的方法之间调用事务是否生效及其他事务失效场景总结

    对于方法之间调用 注解 Transaction生效以及失效的场景 首先 我们需要知道 Spring是通过代理管理事务的 方法和方法之间的调用分为两种情况 解决办法可在下面列举的不同场景中自取 1 不同类之间的方法调用 如类A的方法a 调用类