Spring学习笔记02-Transactional注解原理及失效情况分析

Spring——@Transactional事务注解原理及失效场景 Spring中的事务注解你真的用对了吗?其中的原理、传播机制、失效场景你都理解了吗 阅读详情

1、Transactional注解原理:
首先Transactional注解基于动态代理实现,在代理类中,会增强有该注解的方法,增强的地方有:
    (1)在执行方法前将事务交由Spring事务管理器托管,并且将事务的autoCommit属性置为false(即:禁止事务的自动提交);
    (2)在执行方法的时候检查是否有异常抛出(默认是RuntimeException),如果有,则事务 rollback-回滚;
    (3)在执行方法后,如果一直没有异常抛出,则判定执行成功,然后执行 commit-事务提交。
通过以上三个方面,实现了事务。

2、Transactional注解失效情形及分析:
Transactional注解可能会失效,类似情况如下:

    @Transactional
    public void m1() {
        // ...执行m1相关
        this.m2();
    }

    @Transactional
    public void m2() {
        // ...执行m2相关
    }

如代码所示,在同一个bean中,m1方法直接调用m2方法,m2方法上标注的Transactional注解会失效。

分析原因:
假设现在有一个bean:

@Component
public class MyBean {
    @Transactional
    public void m1() {
        // 执行m1相关...
        this.m2();
    }
    @Transactional
    public void m2() {
        // 执行m2相关...
    }
}

此时,生成动态代理后,代理对象结构类似如下(仅列出大概结构):

public class MyBeanProxy extends MyBean {
    private MyBean target;

    // 动态代理生成的增强方法
    public void m1() {
        // ...在这里关闭事务自动提交
        target.m1();    // 这一步里面会去调用target.m2()
        // ...在这里提交事务
    }
}

        这里坑点在于,动态代理类的结构中,是将原MyBean对象作为成员放在代理类对象中,即target成员。
        当我们在外面通过Spring拿到Bean对象之后,调用m1方法,其实是通过代理对象访问了m1方法,这个方法中增强了原对象的m1方法,即前后包裹了事务处理,但真正执行业务逻辑时,使用的还是代理对象中包含的原对象成员,即上面代码中的target成员。
        因此m1方法中调用m2时,其实是target对象去调用m2方法了,而target对象并不是代理对象,Spring就不会对m2包裹上事务的处理,m2上的Transactional在这种调用的情况下,就失效了。
        当然,这里是说m2上的事务在这里失效了,但是m1的事务仍然有效的,m2在m1中被调用,仍然是被包裹在m1上标识的事务之内的,示例代码中m1和m2都使用了默认的事务传播机制PROPAGATION_REQUIRED ,这种传播机制不会相互冲突,因此不会有太大问题,但如果m1和m2上事务的传播机制不同或者有冲突的时候,则会出现丢失m2事务注解的效果。

解决方案:

        禁止在bean内部调用标识了Transactional注解的方法,以Spring中取得的bean对象直接调用该方法。

Transactional注解三种失效场景及解决方法 然后运行另外一个测试用例,调用一个方法在类内部调用内部被@Transactional标注的事务方法,运行结果是事务不会正常开启,testMapper.insert(new Test(10,20,30))操作将会保存到数据库不会进行回滚。运行测试用例发现,虽然抛出异常,但是异常被捕捉了,没有抛出到方法 外, testMapper.insert(new Test(210,20,30))操作并没有回滚。//类内部调用@Transactional标注的方法。//测试内部调用事务方法是否正常。 阅读详情

相关推荐

从零开始:YOLOv8车牌检测模型训练全流程实战

本文详细介绍了从零开始训练YOLOv8车牌检测模型的全流程实战指南。内容涵盖环境搭建、数据集收集与标注、模型配置与训练、评估测试及高级优化技巧。通过使用预训练模型和迁移学习,开发者可以高效构建精准的车牌检测系统,并掌握模型导出与部署的关键步骤。

weixin_29061041的博客 335

导致Spring事务失效的原因有哪些?

Spring事务生效的前提是所连接的数据库要支持事务,如果底层的数据库都不支持事务,那么,Spring的事务肯定会失效。如果事务方法所在的类没有加载到Spring IoC容器中,也就是说,事务方法所在的类没有被Spring管理,从而导致Spring无法实现代理,所以,Spring事务也会失效。如果同一个类中的两个方法分别为A和B,方法A上没有添加事务注解,方法B上添加了 @Transactional事务注解,方法A调用方法B,那么,方法B的事务会失效。以上就是我对Spring事务失效原因的理解。

m0_73311735的博客 3100

从入门到精通:dirmap 高级 Web 目录扫描实战指南

本文提供了一份从环境搭建到高级配置的dirmap Web目录扫描实战指南。详细解析了工具安装、核心配置文件dirmap.conf的深度调优,包括递归扫描、四种扫描模式(字典、爆破、爬虫、Fuzz)的实战应用,并演示了分阶段资产发现的完整工作流程,帮助安全人员高效发现隐藏目录与敏感文件。

rnn9storyteller的博客 479

Spring事务失效十种原因

本文详细的介绍了Spring事务失效的十种原因,掌握住它们并在工作避免这些情况。

m0_64830897的博客 7110

Fluent动网格+滑移网格+重叠网格对比介绍(以震荡水翼flapping foil为例)

初学fluent笔记,本文主要包含: Flapping foil在fluent内的几种实现方式 在哪设置动网格、滑移、重叠网格 flapping的UDF 示例 写在前面:Fluent在预览网格运动/提交计算之前,注意保存一个cas版本。 -------------------------Flapping foil 网格几种组合实现方式:---------------------- 直接重叠网格,overset, 需要建立两个几何part,part要重合。水翼局部区域(component),背景网格(ba

深海民工CFDer 2万+

深入浅出CenterFusion

结合论文和代码理解CenterFusion

Untitled的专栏 5101

Spring事务@Transactional注解原理

一、思维导图 Spring 事务管理分为编程式和声明式两种。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体的逻辑与事务处理解耦。 声明式事务有两种方式,一种是在配置文件(XML)中做相关的事务规则声明,另一种是基于 @Transactional 注解的方式。 默认配置下 Spring 只会回滚运行时、未检查异常(继承自 RuntimeException 的异常)或者 Error。 @Transactional 注解只能应用到 public 方法才有效。 1.1 声明式事务管理实现

jike11231的博客 1万+

syslog RFC5424协议详解

RFC5424协议解读与报文分析。

chenwr2018的博客 6690

Spring注解事务失效原因

整理了一下Spring事务失效的原因,希望帮到有缘人。 原因一:没有开启事务管理 原因二:标注了@Transactional的方法里面的异常被捕获了 原因三:标注了@Transactional的方法发生了非Error 或者 非RuntimeException 原因四:标注了@Transactional的方法的事务传播类型propagation配置成了NOTSUPPORT 原因五:标注了@Transactional的方法的事务传播类型propagation配置成了NEVER 原因六:标注了@Transact

morrison1的博客 3425

点云从入门到精通技术详解100篇-基于 CBCT 与口内扫描数据的牙齿点云配准

口扫生成的三维牙模型只包含牙冠结构,容易受到唾液、食物残留等杂质的干扰。像精度,但其扫描成本较高,在公立医院的普及率较低。此外,口扫探入式的体。完整、精确的牙齿信息,有助于医生更好地进行数字化辅助诊疗,提高手术的预。可以表示上颌骨、下颌骨、牙冠以及牙根的位置和形状,但其扫描分辨率较低,精配准前实现粗略的预配准来确定点云间的初始位置,为精配准提供良好的配准。该算法通过计算点对间的距离确定源点云中的某一点在目标点云中的对应。算两点之间的欧氏距离,运算量较大,而且由于算法只考虑点集间的距离而忽略。

getusushu的博客 1640

js逆向实战:爬取淘宝男装商品

本文介绍了一个淘宝商品数据爬取程序的技术实现方案。该程序通过分析淘宝H5页面接口,实现了商品名称、价格、销量等关键信息的抓取,并支持图片下载功能。核心内容包括:1. 使用Request库发送HTTP请求获取数据;2. 通过逆向分析淘宝的签名算法(MD5加密)生成合法请求;3. 解析JSON数据并提取商品信息;4. 处理分页参数实现多页数据爬取;5. 将数据保存为CSV文件并下载商品图片。程序还实现了反爬虫绕过、错误处理、文件管理等辅助功能,完整展示了从数据采集到存储的全过程。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1572

【spring】@Transactional 注解失效的原因及解决办法

面试中经常会被问到事务失效的场景有哪些,其实在开发中,若是不了解事务失效的场景,当你觉得加了事务,就会回滚,就大错特错了,今天就来了解一下吧。

来到人间不过是个蹭饭的客人,还挑什么酸甜苦辣。 7493

2026年CSP-J初赛真题及答案解析

2026年CSP-J初赛真题及题解

王老师青少年编程 1613

@Transactional注解失效的情况

该篇博客主要介绍@Transactional注解失效的12种情况,我是看b站的一个up主进行搬运总结的,希望对我、对你都有一点一点的帮助。

qq_40834643的博客 5442

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

事务Transactional失效的这10个场景,你一定得知道!

事务Transactional失效的这10个场景,你一定得知道!

3094

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java中Spring框架的`@Transactional`注解失效的常见情况,包括失效原因、底层原理以及解决方法

@Transactional注解失效的常见情况包括:非public方法、内部调用、异常类型不匹配、传播行为不当、多线程调用以及未启用事务管理。非public方法无法被Spring AOP代理,内部调用绕过代理,异常类型不匹配导致不回滚,传播行为设置不当可能挂起事务,多线程调用导致事务上下文丢失,未启用事务管理则无法支持事务。解决方法包括:确保方法为public,通过代理调用内部方法,指定回滚异常类型,调整传播行为,使用TransactionTemplate或同步调用,以及检查事务配置。这些措施可以有效避免事

Edward274的博客 1608

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

transactional注解原理-代码走读

代理类在整个bean的生命周期中位于initBean的时候,也就是实例化完成,属性赋值完成之后,执行postProcessAfterInitialization回调函数创建代理类。对于事务的处理,代理类会先关闭自动提交,这一步就表示开启事务了。如果a函数调用b函数,a函数没有transactional注解,b有注解,由于代理只代理了a函数,对于b函数不会执行代理,所以事务不会生效。判断用jdk还是cglib,因为cglib要继承原本的类实现代理,所以要检查情况,如果不能继承,就需要用jdk代理。

2401_89221867的博客 758

Spring @Transactional注解失效的情况及解决方法

Spring @Transactional注解失效的情况及解决方法

果酱 の 博客 6140

【Java面试篇】Spring中@Transactional注解事务失效的常见场景

记录一下使用@Transational注解实现事务,常见的几种失效场景

热爱编程、热爱生活、热爱探索 1万+

spring事务(注解 @Transactional )失效的12种场景

文章目录一 、事务不生效【七种】1.访问权限问题 (只有public方法会生效)2. 方法用final修饰,不会生效3.同一个类中的方法直接内部调用,会导致事务失效3.1 新加一个Service方法3.2 在该Service类中注入自己3.3 通过AopContent类4.(类本身) 未被spring管理5.多线程调用6.(存储引擎)表不支持事务7.未开启事务二、事务不回滚【五种】1.错误的传播特性2.自己吞了异常3.手动抛了别的异常4.自定义了回滚异常5.嵌套事务回滚多了三、大事务与编程式事务1. 大事务

憧憬的专栏 4万+

Transactional注解详解

1、@Transactional注解可以作用于哪些地方? @Transactional 可以作用在接口、类、类方法。 作用于类:当把@Transactional 注解放在类上时,表示所有该类的public方法都配置相同的事务属性信息。 作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。 作用于接口:不推荐这种使用方法,因为一旦标注在Interface上并且配置了Spring AOP 使用CGLib动态代

weixin_44517305的博客 1万+

Transactional注解的失效场景

Transactional注解的失效场景、基于注解的声明式事务管理、使用Transactional注解需要注意的问题

qq_39350797的博客 449

聊一聊Spring中的@Transactional注解【下】【注解失效场景】

尽管 `@Transactional` 注解在 Spring 中提供了方便的事务管理功能,我们在使用过程中却常常面临其失效的问题。事务失效可能导致意想不到的数据状态和错误,影响应用的稳定性和可靠性。本文将探讨一些常见的 `@Transactional` 失效场景

懒惰蜗牛的博客 1213

事务Transactional注解的参数与失效场景分析

Transactional注解真的会用吗?

Java鱼仔的博客 1484

Spring中解决事务以及异步注解失效

摘要: Spring开发中,@Transactional和@Async注解在同一类内调用时可能失效,表现为事务未回滚或异步未执行,原因是Spring AOP代理机制未生效(直接调用原始方法而非代理对象)。解决方案包括:1)配置expose-proxy=true并通过AopContext.currentProxy()调用;2)通过ApplicationContext获取代理Bean;3)将方法拆分到不同类中。推荐方案一或三,确保代理增强生效。理解此机制对编写可靠Spring应用至关重要。

ywl470812087的博客 12万+

@Transactional注解什么情况会失效?

1、@Transactional 应用在非 public 修饰的方法上 如果Transactional注解应用在非public 修饰的方法上,Transactional将会失效。 之所以会失效是因为在Spring AOP 代理时,如上图所示 TransactionInterceptor (事务拦截器)在目标方法执行前后进行拦截,DynamicAdvisedInterceptor(CglibAopProxy 的内部类)的 intercept 方法或 JdkDynamicAopProxy 的 invok

qq_44972451的博客 5712
上一篇: Spring学习笔记01-解决循环依赖
下一篇: Spring学习笔记03-Configuration注解分析
Yancy Piggy
博客等级 码龄14年 27粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值