SpringBoot-@Transactional注解失效

@Transactional注解失效

@Transactional失效场景

以下是一些常见导致@Transactional注解失效的场景,配合相应的Java代码演示:

1、方法修饰符非公开(非public

@Transactional注解失效的原因在于Spring事务管理器如何实现对事务的代理和管理。Spring使用AOP(面向切面编程)机制来处理@Transactional注解的方法。具体而言,Spring会在运行时为带有@Transactional注解的Bean创建一个代理对象,代理对象负责在方法调用前后添加事务的开始、提交或回滚等逻辑。

当方法修饰符为非公开(非public)时,导致@Transactional失效的原因主要有以下两点:

  1. AOP代理的默认行为
    Spring AOP默认仅对public方法进行代理增强。这是因为Spring使用JDK动态代理(对于接口代理)或CGLIB代理(对于类代理)来创建代理对象。这两种代理方式均基于继承或接口实现,对非public方法的代理存在技术上的限制。JDK动态代理只能代理接口方法,自然无法代理非public方法;CGLIB虽然可以代理类的非public方法,但Spring AOP的默认配置并不包括对非public方法的增强。

  2. 设计原则与最佳实践
    从设计原则和最佳实践的角度考虑,服务层方法通常应该对外提供明确的、有限的接口(即public方法),而将内部细节(如非public方法)隐藏起来。因此,@Transactional注解通常应用于服务层的业务方法,这些方法通常是public的,以便外部调用。非public方法通常用于实现具体的业务逻辑,如果它们需要参与到事务管理中,通常是因为它们被某个@Transactional注解的public方法调用,此时事务管理应由调用方(即public方法)负责。

综上所述,由于Spring AOP的默认行为和设计原则的考量,非public方法上的@Transactional注解通常不会被Spring事务管理器识别和处理,从而导致事务注解失效。若确实需要对非public方法进行事务管理,通常需要调整Spring的AOP配置,或者更改为在调用这些方法的public方法上添加@Transactional注解。然而,这并不符合最佳实践,通常建议将事务边界设定在对外提供的public方法上。
在这里插入图片描述

2、内部方法调用

@Service
public class UserService {@Transactionalpublic void updateUser() {// 调用内部私有方法,事务不会传播到此方法processUpdate();}// @Transactional在此处无效,因为是通过非代理对象直接调用private void processUpdate() {// 更新数据库操作...}
}
  1. 异常捕获但未抛出

    @Service
    public class OrderService {@Transactionalpublic void placeOrder() {try {// 执行可能抛出异常的操作saveOrderDetails();// 其他业务逻辑...} catch (Exception e) {// 异常被捕获但未重新抛出,事务不会回滚log.error("An error occurred while placing the order", e);}}private void saveOrderDetails() throws SQLException {// 可能抛出SQLException的数据库操作}
    }
    
  2. 事务传播设置不当

    @Service
    public class TransactionalServiceA {@Transactional(propagation = Propagation.NEVER)public void nonTransactionalMethod() {// 如果此方法在另一个已开启事务的方法中被调用,由于传播设置为NEVER,此处事务将不会生效performTransactionalOperation();}@Transactionalprivate void performTransactionalOperation() {// 应该在事务中执行的操作}
    }
    
  3. 配置问题:未启用代理模式或代理对象未被正确使用

    // 假设配置中未启用Spring AOP代理(如使用了CGLIB代理而非JDK动态代理)
    // 或者在某些情况下直接通过new关键字创建了Service实例,而非依赖注入
    UserService userService = new UserService();// 由于userService不是由Spring容器管理的代理对象,@Transactional将失效
    userService.updateDataInTransaction();
    
  4. 事务超时或并发控制设置冲突

    @Service
    public class InventoryService {@Transactional(timeout = 1)  // 设置较短的事务超时时间public void adjustStock() {// 长时间运行的数据库操作,可能导致事务超时而提前结束,不保证原子性// ...}
    }
    

以上代码示例展示了可能导致@Transactional注解失效的几种常见场景。在实际使用中,应确保正确配置Spring事务管理器、合理设置事务属性,并遵循Spring AOP代理的使用规则,以确保事务功能正常运作。

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

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

相关文章

【跟马少平老师学AI】-【神经网络是怎么实现的】(七-2)word2vec模型

一句话归纳: 1)CBOW模型: 2c个向量是相加,而不是拼接。 2)CBOW模型中的哈夫曼树: 从root开始,向左为1,向右为0。叶子结点对应词有中的一个词。每个词对应唯一的编码。词编码不等长。…

Redis基本數據結構 ― String

Redis基本數據結構 ― String 介紹常用命令範例1. 為字串鍵設值/取得字串鍵的值2. 查看字串鍵的過期時間3. 如何為key設置時間?4. 如何刪除指定key?5. 如何增加value的值?6. 獲取value值的長度 介紹 字串鍵是Redis中最基本的鍵值對類型,這種類型的鍵值對會在數據…

Spring - 10 ( 9000 字 Spring 入门级教程 )

一:MyBatis 进阶 动态 SQL 是 Mybatis 的强大特性之⼀,能够完成不同条件下不同的 sql 拼接。 1.1 if 标签 在注册用户的时候,可能会有这样⼀个问题,如下图所示: 注册分为两种字段:必填字段和非必填字段&…

Vue ui 创建vue项目,详细使用攻略。

1.安装及启动 1.1 Vue ui 使用前提是全局安装vue.js 命令如下 npm install vue -g 1.2 安装过Vue.js 之后 随便在自己系统的一个地方打开命令面板 1.3 使用命令启动vue ui面板创建项目 vue ui 如图运行后显示这种就是启动成功,成功之后会弹出页面或者直接访问你的…

伦敦金的交易时间段都适合投资吗?

是所有的交易时间段都适合投资。首先,让我们了解伦敦金的交易时间。伦敦金市场的交易时间分为两个主要时段:亚洲盘和欧美盘。亚洲盘通常在北京时间早晨6点至下午5点半左右,而欧美盘则从北京时间晚上8点半开始,一直到次日早晨4点半…

痉挛性斜颈患者早上运动还是下午运动更合适?选对了让治疗更简单!【北京仁爱堂】

对于痉挛性斜颈患者来说,选择合适的运动时间对于治疗的效果和舒适度至关重要。那么,痉挛性斜颈患者早上运动还是下午运动更合适呢?本文将从多个角度对此进行分析,帮助患者找到最适合自己的运动时间。 首先,我们需要了…

特征提取(Feature Extraction)常见统计特征笔记(三)

统计特征是描述数据集中值的一组量,通常用于了解数据的分布、集中趋势和变异程度。常见的统计特征包括均值、中位数、众数、标准差、方差等。下面会详细解释每个统计特征,并给出相应的Python代码。 1、均值(Mean):所有…

Python的使用

1、打印:print(‘hello’) 2、Python的除法是数学意义上的除法 print(2/3) 输出:0.6666... 3、a18 a‘hello’ print(a) 可以直接输出 4、**2 表示2的平方 5、打印类型 print(type&am…

答案自在你心——不求事事皆如愿,只求件件都无悔

时光荏苒,弹指间,似如梦初醒般又迎来了大学的第二个五一假期。多数人看来,又是一个千载难逢的度假时光,于我而言,心里却一直紧绷一根迟迟难以松弛的弦。也许是习惯了平常忙忙碌碌的生活节奏,突然停下来&…

linux下载压缩包

比如我要下载的压缩包地址为: http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/cocostuff-10k-v1.1.zip 1.创建文件夹并切换到这个目录下 2.用wget获取压缩包 压缩包下好了 3.解压 如果是 tar.gz包解压 tar -zxvf 也可以解压到具体的目录…

手撸Mybatis(一)——代理mapper

引言 最近刚写完毕设,闲来无事,看到网上有一个手撸Mybatis的教程,于是想自己实现一个简易版的Mybatis。 本专栏的源码:https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 创建简单的映射器代理工厂 在使用mybatis的时候&…

Python语言在地球科学中地理、气象、气候变化、水文、生态、传感器等数据可视化到常见数据分析方法的使用

Python是功能强大、免费、开源,实现面向对象的编程语言,Python能够运行在Linux、Windows、Macintosh、AIX操作系统上及不同平台(x86和arm),Python简洁的语法和对动态输入的支持,再加上解释性语言的本质&…

doxygen 辅助阅读代码的神器

简介 Doxygen是一个文档生成工具,主要用于编写编程语言的软件文档。它最初是为C设计的,但后来增加了对C、C#、Java、Objective-C、Python、IDL(在某些情况下还有PHP、C#和D)的支持。Doxygen可以从一组带有文档注释的源代码文件中…

Mamba3D革新3D点云分析:超越Transformer,提升本地特征提取效率与性能!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! Mamba3D革新3D点云分析:超越Transformer,提升本地特征提取效率与性能! 引言:3D点云分析的重要性与挑战 3D点云…

软件工程毕业设计选题100例

文章目录 0 简介1 如何选题2 最新软件工程毕设选题3 最后 0 简介 学长搜集分享最新的软件工程业专业毕设选题,难度适中,适合作为毕业设计,大家参考。 学长整理的题目标准: 相对容易工作量达标题目新颖 1 如何选题 最近非常多的…

ubuntu ros noetic 编译 ORB_SLAM2 过程记录

1. 连接 eigen库 sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen 2. opencvx 修改 CMakeList.txt 中的 find_package open cv版本 修改 include/orbExtracter.h 文件为&#xff1a; //#include <opencv2/opencv.hpp> #include<opencv2/imgproc/imgpro…

【深入浅出MySQL】「性能调优」高性能查询优化MySQL的SQL语句编写

高性能查询优化MySQL的SQL语句编写准则这里写目录标题 总体优化大纲&#xff08;1&#xff09;优化查询性能&#xff1a;通过索引降低全表扫描频率优化方向案例介绍问题分析解决方案建立复合索引建立单独索引 &#xff08;2&#xff09;优化数据表与查询&#xff1a;合理使用非…

【C语言的完结】:最后的测试题

看到这句话的时候证明&#xff1a; 此刻你我都在努力~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;语言的起点-----C语言 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹…

PZK via OWF

参考文献&#xff1a; [SMP88] Santis A, Micali S, Persiano G. Non-Interactive Zero-Knowledge with Preprocessing[C]//Advances in Cryptology—CRYPTO’88.[LS90] Lapidot D, Shamir A. Publicly verifiable non-interactive zero-knowledge proofs[C]//Advances in Cry…

解决WordPress无法强制转换https问题

原因&#xff1a;我在用cs的时候&#xff0c;突然老鸟校园网突然断了&#xff0c;客户端cs连不上了&#xff0c;进程也杀不死&#xff0c;cpu占用100%&#xff0c;只能重启&#xff0c;但是重启后我的blog网站打不开了 开始以为是Nginx的问题&#xff0c;重启它说配置出了问题…