@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注解的方法之间调用事务是否生效及其他事务失效场景总结 的相关文章

  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 非 Spring 托管类中 DI 的编译时编织

    我想为标记为的类配置编译时编织 Configurable注释能够将 spring 依赖项注入到初始化的类中new操作员 我不想使用加载时编织 因为我无权访问应用程序服务器的运行脚本 因此无法修改它 另外 我希望能够在测试中使用此类 我的意思
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • 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 调用类