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中最基本的鍵值對類型,這種類型的鍵值對會在數據…

什么是Vuex它的作用是什么怎么用

Vuex是一个专门为Vue.js应用程序开发的状态管理模式。你可以将其想象为一个“前端数据库”或数据仓库,用于管理前端项目的变量。它的核心是一个store(仓库),这个仓库基本上是一个容器,包含了应用中大部分的状态&#x…

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

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

acwing算法提高之数学知识--同余和矩阵乘法

目录 1 介绍2 训练 1 介绍 本博客用来记录同余和矩阵乘法相关的题目。 2 训练 题目1&#xff1a;203同余方程 C代码如下&#xff0c; #include <iostream> #include <algorithm> #include <cstring>using namespace std;typedef long long LL;int exgcd…

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

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

汇编语言-内中断

概念&#xff1a; 任何一个通用 CPU 都具备一种能力, 可以在执行完当前正在执行的指令之后, 检测到从 CPU 外部发送过来的或者内部产生的一种特殊信息, 并且可以立即对所接受到的信息进行处理&#xff0c;这种特殊的信息称为&#xff1a; 中断信息 中断意味着 CPU 不再继续…

opencv invert函数

在OpenCV中&#xff0c;cv::invert函数用于计算矩阵的逆。它的语法如下&#xff1a; bool cv::invert(InputArray src, OutputArray dst, int flagsDECOMP_LU)其中&#xff1a; src 是输入矩阵&#xff08;2x2或者NxN&#xff09;。dst 是输出矩阵&#xff0c;即计算得到的逆…

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

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

什么是gcc-arm-linux-gnueabihf?

2024年5月3日&#xff0c;周五晚上 gcc-arm-linux-gnueabihf 是针对 ARM 架构&#xff08;ARMv7 和 ARMv8&#xff09;的 Linux 系统开发的 GNU C/C 编译器套件&#xff0c;可以在 x86 或 x86_64 架构的主机上使用&#xff0c;用于交叉编译 ARM Linux 应用程序和库。 gcc-arm-…

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

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

python学习笔记----文件操作(八)

一、 open() 函数 在 Python 中&#xff0c;处理文件包括读取和写入操作&#xff0c;是通过使用内置的 open() 函数来实现的。 语法&#xff1a; open(file, mode"r", encoding"utf-8") file: 文件路径。mode: 文件打开模式&#xff1a; ‘r’&#xff…

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

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

Python的使用

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

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

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

轻松管理Java开发环境:SDKMAN!带来的便捷革命

前言 在当今软件开发的潮流中&#xff0c;有效地管理开发环境对于项目的顺利进行至关重要。随着项目规模的不断扩大和不同软件版本的需求增加&#xff0c;手动管理各种开发工具变得愈发繁琐。幸运的是&#xff0c;随着SDKMAN!的出现&#xff0c;Java开发者不再需要为此烦恼。这…

zookeeper数据迁移至clickhouse-keeper

1&#xff09;找到zookeeper主节点 zkServer.sh status 查看返回结果&#xff1a; ZooKeeper JMX enabled by default Using config: /conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false.Mode: leader Mode说明&#xff1a;值为leader 代表…

linux下载压缩包

比如我要下载的压缩包地址为&#xff1a; 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

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

24考研双非上岸武汉理工大学电子信息专硕,855考研经验

目录 一、考研择校经验 二、武理考研初试经验 三、武理考研复试经验 一、考研择校经验 我建议学弟学妹们确定院校时没必要一上来就说我一定要考某个院校。其实考哪个学校是要在考研备考的过程中慢慢探索&#xff0c;慢慢研究的&#xff0c;不过最晚9月初一定要确定院校了&a…