SpringBoot-@Transactional注解失效

news2025/1/11 17:09:29

@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 {

    @Transactional
    public void updateUser() {
        // 调用内部私有方法,事务不会传播到此方法
        processUpdate();
    }

    // @Transactional在此处无效,因为是通过非代理对象直接调用
    private void processUpdate() {
        // 更新数据库操作...
    }
}
  1. 异常捕获但未抛出

    @Service
    public class OrderService {
    
        @Transactional
        public 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();
        }
    
        @Transactional
        private 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.coloradmin.cn/o/1640126.html

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

相关文章

【竞技宝】意甲:退出齐尔克泽争夺战!国米免签伊朗神锋!

博洛尼亚中锋齐尔克泽成为了意甲当红炸子鸡,不少豪门球队都希望可以签下他,目前对球员有意向的俱乐部包括AC米兰、尤文图斯、阿森纳、国际米兰和曼联,看到自家球员如此有市场,博洛尼亚方面咬死5000万欧元的价格不松口,想要得到他必须要拿出真金白银。不过意甲霸主国际米兰率先退…

C++:编程语言中的永恒经典与未来之星

在计算机科学的世界里,C无疑是一个不可忽视的存在。它以其卓越的性能、灵活的编程风格和广泛的应用领域,成为了众多程序员的首选语言。本文将探讨C的历史地位、当前应用以及未来的发展趋势,揭示其作为编程语言中的永恒经典与未来之星的魅力。…

【C++ —— 多态】

C —— 多态 多态的概念多态的定义和实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变:析构函数的重写 C11 override和final重载、覆盖(重写)、隐藏(重定义)的对比 抽象类概念接口继承和实现继承 多态的继承虚函数表多态的原理动态绑定和静态绑定 单继…

IntelliJ IDEA - Auto filling Java call arguments 插件教程

首先,安装该插件,下载完毕后重启 IDEA 当 userService 中方法需要参数的时候,我们一般都是自己手动写这些参数,是很费劲的。因此就出现了一个插件解决这类问题 Auto filling Java call arguments 光标点击需要填写参数的位置 Alt …

【CTF-Crypto】修复RSA证书入门汇总

证书修复 文章目录 证书修复基础知识Truncated 1Truncated 2Jumbled 基础知识 为什么要引入证书? 在正常题目中,大部分直接给出了数字,但是数字在现实世界中传输不稳定,容易在某处出现错误,所以我们将所有的数字信息…

【skill】远程连接的Win服务器,几分钟无操作就进入登录界面

远程连接的Win服务器,几分钟无操作就进入登录界面,这时候必须输入密码或者重新连接才能进到桌面 错误的解决方法: 与电源管理没半毛关系!这是远程连接的Win服务器! 根源是“屏保”的问题,所以正确、有效的…

【中断】【ARM64】学习总结

optee中的异常向量表解读–中断处理解读 https://mp.weixin.qq.com/s/gBsy4YDYTHGRsy2zcVr6Vg

一键切换ip地址的软件哪个好用

随着互联网的快速发展,IP地址的重要性日益凸显。它不仅代表着每台设备在网络上的唯一标识,还关乎到我们的网络隐私、访问权限以及工作效率。一键切换IP地址的软件应运而生,为我们提供了极大的便利。那么,在众多选择中,…

使用jdbc方式操作ClickHouse

1、创建测试表,和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …

2024年UX/UI发展趋势

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 2023年是科技创新的一年:我们见证了苹果虚拟眼镜的推出、人工智能驱动的衍生式设计的兴起以及三星的可折叠智能手机。网络现在融入了越来越多明亮且对比…

前沿科技应用:AIGC技术的广泛渗透

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【redis】redix在Linux下的环境配置和redis的全局命令

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

Apache SSI远程命令执行漏洞

什么是SSI Apache SSI(Server Side Include),通常称为"服务器端嵌入"或者叫"服务器端包含",是一种类似于ASP的基于服务器的网页制作技术。默认扩展名是 .stm、.shtm 和 .shtml。 从技术层面来讲,SSI是一种在静…

微服务架构下规范实践-研发管理

微服务架构下规范 目录概述需求: 设计思路实现思路分析3.代码托管 4.统计分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change…

机器学习:深入解析SVM的核心概念【四、软间隔与正则化】

软间隔与正则化 问题一:优化目标函数是如何得到的?得到的过程是怎样的?问题二:拉格朗日乘子法计算详细过程问题三:KKT条件求解过程问题四:结构风险最小化(SRM)的原理 在前面的讨论中…

【Linux系统编程】第十二弹---编辑器gcc/g++使用

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、什么是gcc/g 2、gcc/g编辑器的安装 3、gcc/g编译的四个步骤 2.1、预处理 2.2、编译 2.3、汇编 2.4、链接 4、函数库 …

jadx-gui添加dex文件失败,提示Bad checksum

之前都是使用jadx直接打开的apk文件,要添加dex文件时突然添加失败并报错 也就是会校验dex的checksum,直接关闭会导致dex文件反编译失败。 解决方案:查日志后得到关闭校验即可 操作方式如下:

Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解

目录 什么是分代收集算法 GC的分类和专业术语 什么是垃圾收集器 垃圾收集器的分类及组合 ​编辑 应关注的核心指标 Serial和ParNew收集器原理 Serial收集器 ParNew收集器 Parallel和CMS收集器原理 Parallel 收集器 CMS收集器 新一代垃圾收集器G1和ZGC G1垃圾收集器…

未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势

文章目录 一、人工智能的定义和概述1. 人工智能的基本概念2. 人工智能的发展历史 二、技术深入:机器学习、深度学习和神经网络1. 机器学习2. 深度学习3. 神经网络 三、人工智能的主要目标和功能1. 自动化和效率提升2. 决策支持和风险管理3. 个性化服务和预测未来 本…

【目标检测】DEtection TRansformer (DETR)

一、前言 论文: End-to-End Object Detection with Transformers 作者: Facebook AI 代码: DEtection TRansformer (DETR) 特点: 无proposal(R-CNN系列)、无anchor(YOLO系列)、无NM…