Spring 中事务方法的调用

ESP32-P4 GPIO双域架构:HP/LP分离、寄存器级控制与低功耗工程实践 GPIO(通用输入输出)是嵌入式系统中最基础且高频使用的硬件接口,其性能、灵活性与功耗特性直接影响产品实时性与续航能力。现代高性能MCU如ESP32-P4通过HP/LP双电源域分离、可编程IO复用(IO MUX)、信号交换矩阵及硬件自动化机制(如ETM事件、Sigma-Delta调制),将传统GPIO升级为兼具模拟能力、亚微秒响应与微安级待机的智能外设子系统。其核心价值在于实现引脚功能动态重构、中断零延迟处理、Deep-sleep期间自主唤醒与多核安全操作。典型应用场景涵盖工业PLC信号采集、电池供电传感器 阅读详情

前言
Spring 提供了事务的管理机制,我们只需要在方法或者类上加上 @Transactional 注解进行事务管理。而非事务方法与事务方法之间相互调用,有时会使事务失效,本文是对该情形下的事务总结
什么是事务传播机制
事务在多个方法的调用中是如何传递的,是重新创建事务还是使用父方法的事务?父方法的回滚对子方法的事务是否有影响?这些都是可以通过事务传播机制来决定的。

Spring 默认是 PROPAGATION_REQUIRED 机制。 下面来举一个例子:

	public class Demo
	{
		@Transactional
		public void fisrt(){
			second();
		}
		
		public void second(){}
	}

这种情况,first 方法标注了 @Transactional 注解,而 second 方法为普通方法。由于 REQUIRED 机制,执行的时候,事务会传播给 second 方法,因此执行到 second 方法时,事务依然是生效的。接下来,反过来,就是本次遇到的问题:

	public class TestService
	{
		public void fisrt(){
			second();
		}
		
		@Transactional
		public void second(){}
	}

第二种情况,即使 second方法标注了 @Transactional 注解,事务也不会生效。
原因: 这是因为 Spring 采用动态代理机制来实现事务控制。在扫描 Bean 的时候,会给有 @Transactional 的类,生成一个代理子类。只有调用代理子类对象的方法,才会新建一个事务并调用原始对象的方法。而第二种情况,直接在原始对象 TestService 中调用标注了 @Transactional 注解的 second方法 时,是无法触发代理的。spring的事务实现是使用了代理类来实现,而这里的second(),并没有走TestService的代理类,所以事务会失效。

@Service
public class OrderServiceImpl implements OrderService {

    @Transactional
    public void update(Order order) {
        updateOrder(order);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateOrder(Order order) {
        // update order
    }

}

这次在 update 方法上加了 @Transactional,updateOrder 加了 REQUIRES_NEW 新开启一个事务,那么新开的事务管用么?
这两个例子的答案是:不管用!
因为它们发生了自身调用,就调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效,这也是老生常谈的经典问题了。

解决方案:
第一种: 通过依赖注入
创建新的 Service,将 @Transactional 标注的方法抽离出来,通过 @Autowire 注入进来进行调用。
第二种: 直接获取代理对象
开启注解:@EnableAspectJAutoProxy(exposeProxy = true)

	Demo demoProxy = (Demo)AopContext.currentProxy();
	demoProxy.second();

第三种: 获取实例化后的 Demo

	@Autowire
	private ApplicationContext applicationContext;
	Demo demo = applicationContext.getBean(this.getClass());
	demo.second();

其实,这几种方法都是为了调用到代理子类中的方法。

手把手教你用Arduino IDE玩转ESP32-S3-wroom(附串口调试技巧) 本文详细介绍了如何在Arduino IDE环境下配置和使用ESP32-S3-WROOM模块,包括开发环境搭建、硬件连接、程序烧录及高级调试技巧。通过实战步骤和常见问题解决方案,帮助开发者快速上手这一高性能Wi-Fi/蓝牙双模模组,提升物联网开发效率。 阅读详情

相关推荐

RAG——RAG 索引(文档解析技术)

本文介绍了RAG系统中文档解析的关键技术,重点分析了如何通过LangChain的Document Loaders处理多种格式文档。文章指出高质量文档解析对RAG系统效果的决定性作用,并详细讲解了PDF、TXT、Word等常见格式的解析方法。作者提供了代码示例和Gitee开源项目链接,特别强调了PDF解析的深入方案,同时介绍了相关依赖库的安装配置。文章还展示了如何定义通用文档加载方法,为开发者提供了实用的技术参考。

小志的博客 751

Spring事务失效,同一个类中的内部方法调用事务失效

声明式事务实现方式 所谓声明式事务,也就是通过配置的方式,比如通过配置文件xml或者注解的方式,来告诉Spring哪些方法需要Spring帮忙管理事务,然后开发者只需要关注业务代码,而事务的事情则由Spring自动帮我们控制。 配置文件的方式:即在spring.xml文件中进行统一配置,开发者基本不用关注事务的事情了,一切交给spring处理。 基于注解的方式:只需要在想要添加事务的方法上加上@Transaction注解就可以了。 实际工作中,基于配置文件的方式用的很少,我们工作中主要还是用注解的方

NoviceZ的博客 9820

道路损伤检测必备:RDD2022数据清洗与增强的5个关键步骤

本文详细介绍了道路损伤检测中RDD2022数据集清洗与增强的5个关键步骤。通过深度数据质量审计、跨国家分布分析、面向真实场景的智能增强、以模型表现为导向的数据集划分,以及构建自动化处理流水线,将原始数据转化为高质量训练集,有效提升模型性能。

cola5的博客 512

Spring事务失效场景之类内部方法调用及解决方案

在日常开发中,经常有需要使用事务来保证数据一致性的情况。简单点的话直接在方法上面加@Transactional注解就可以了。但这样存在一个问题,在整个业务方法层面加注解会把很多并不需要归入事务的操作也归入到了事务里面,这样会可能会出现大事务的情况,影响系统性能。为了提高系统性能,比较好的一种方案是只把操作数据库的部分代码放到一个方法,给这个小方法加上事务,这样基本不会出现大事务的问题。而要实现这种方案,会碰上很常见的一种事务失效的场景。

weixin_43975276的博客 1668

基于zynq在linux下的AXI-CAN实战

从petalinux的搭建,到uboot、kernel、rootfs的调试、打包提示:以下是本篇文章正文内容,下面案例可供参考本次要讲述的zynq的AXI-CAN实战小知识就说到这里了,兄弟萌要有什么指导意见或疑问可以在评论区留下"足迹"。

qq_45521099的博客 3164

5GCPE与4G物联网卡兼容实战:通过AT指令修改IMEI实现设备迁移

本文详细介绍了如何通过AT指令修改5GCPE设备的IMEI,实现4G物联网卡的设备迁移。从硬件准备、驱动安装到串口工具配置,再到具体的AT指令操作步骤,提供了全面的实战指南。文章还包含信号优化、APN设置等实用技巧,帮助用户顺利完成设备迁移并提升网络性能。

weixin_28684757的博客 629

Spring中的事务

事务的失效的场景: 要方法和方法均单独保持事务一致性:如果不是用代理调用注解是不生效的,所以一定要使用代理调用实现,然后让方法和方法分别单独开启新的事务。

qq_51076413的博客 551

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

2301_81256766的博客 1260

Spring事务嵌套机制

Spring 事务机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷。 其实这是不认识Spring事务传播机制而造成的误解,Spring对事务控制的支持统一在TransactionDefinition类中描述,该类有以下几个重要的接口方法: int ge...

sun82111的专栏 1万+

从SD更新字库到FLASH,再用LCD显示

用Flash当字库存储载体。思路是先将要用到的字库文件存在SD卡,然后存储到Flash,LCD显示时候从Flash中读取 还挺顺利的,移植的原子的程序,自己稍加修改,主要是我的液晶屏函数,Flash读写函数,还有存储文件的flash地址不一样。一晚上搞定,大小字体都OK。挺高兴哈哈。这几天忙工作事情有点耽搁了学习进展嘿嘿 在text.c的showstr函数中char的字体颜色随意设置的,可以显...

weixin_30505751的博客 914

手把手实现STM32+ESP8266+原子云服务器+手机APP应用——第一节-ATK-ESP8266 WIFI模块通过USB-TTL实现连接原子云服务器与手机APP互相通信

本节实现ATK-ESP8266 WIFI模块通过USB-TTL实现连接原子云服务器与手机APP通信。具体来说,本节使用串口CH340(USB-TTL)连接正点原子ATK-ESP8266 WIFI模块,通过AT命令实现连接原子云服务器与手机APP互相通信,实现硬件设备(WIFI模块)与云服务器和手机APP的互相通信。后面章节不用串口CH340(USB-TTL),通过编写单片机程序实现数据远程互相通信,并介绍手机APP的程序设计。单片机任意款即可,STM32F1系列,F4系列,H系列等都可以。本系列为(手把手实

嵌入式阿齐Archie 8419

非事务方法调用事务方法情况下,让事务生效的几种方式

spring 事务

JS中如何根据数组中的相同元素划分成多个集合放在一个Map(对象)中 1788

从 SEGW 到 SADL 的那根线,彻底理解 OData Data Source Mapping

本文摘要(150字): 在SAP Gateway的SADL型OData服务开发中,"Map to Data Source"是关键配置环节。与传统RFC映射不同,SADL映射不是针对单个CRUDQ操作,而是建立OData模型与SADL业务实体间的完整语义对应关系。通过属性映射和关联映射,系统能自动处理数据获取和导航请求。映射编辑器支持三种模式:属性映射处理字段对应,关联映射处理模型间关系,动作映射处理业务操作。映射的本质是建立语义翻译表,决定了后续OData请求如何转化为后端业务实体访问,而非简单的字段重命名

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 61

关于 Spring 中事务方法的调用

前言 Spring 提供了事务的管理机制,我们只需要在方法或者类上加上 @Transactional 注解进行事务管理。而非事务方法与事务方法之间相互调用,有时会使事务失效,本文是对该情形下的事务总结。 什么是事务传播机制 事务在多个方法的调用中是如何传递的,是重新创建事务还是使用父方法的事务?父方法的回滚对子方法的事务是否有影响?这些都是可以通过事务传播机制来决定的。 Spring 中定义了7中事务传播机制: PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。 P

MOKE_SPACE 2102

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring 事务方法调用问题(@Transactional)

前置条件 创建表 CREATE TABLE `test_table` ( `id` int(9) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(10) CHARACTER SET latin1 DEFAULT NULL COMMENT '姓名', `sex` tinyint(1) DEFAULT NUL...

qq_27255679的博客 2366

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

spring事务方法调用不生效的场景

日常开发中,我们经常使用到spring事务。最近一位朋友去美团面试,被问了这么一道面试题:Spring 事务在哪几种情况下会不生效?今天田螺哥跟大家聊聊,spring事务不生效的15种场景。

zzy7075的专栏 1521

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring事务失效 -方法内部调用

文章 添加链接描述https://www.cnblogs.com/heqiyoujing/p/11221093.html

炫的博客 2万+

Spring 事务到底怎么传?方法调用会不会开启事务?

本文围绕 Spring 事务传播机制展开,系统说明了常见传播行为的含义及配置方式,并结合方法调用场景,分析事务何时生效、何时失效及其背后的代理原理。通过结论先行的方式,帮助读者快速理解事务传播在实际开发中的真实表现。

稳扎稳打,持续进步 1543

spring事务失效场景三:内部方法调用

这篇笔记主要记录spring事务失效场景三:在同一个类中,用非事务方法调用事务方法 首先,这种场景,失效的原因是,在非事务方法中,调用同一个类的事务方法,和动态代理没有关系,事务拦截器无法拦截到,就是一个this方法调用,所以,在实际业务开发过程中,一定要避免这种场景 应用 应用其实简单 ...

小小少年的博客 1294

spring事务,非事务方法与事务方法执行相互调用

首先我们来看下spring事务的传播机制及原因分析; PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_

sunny潘先生的博客 2126

事务方法调用非事务方法_Spring事务失效原因及解决方法

spring 提供事务功能需要依赖于数据库的事务支持。而数据库层的事务提交和回滚是通过bin log 或者 redo log 实现的。大部分情况下我们使用基于 @Transactional 注解的声明式事务。声明式事务本质是通过 AOP 功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。对于Spring事...

weixin_36393718的博客 7877

spring 事务类中方法循环调用

上年解决一个本类调用本类的方法,导致事务失效,今天小G想到这个问题,然后看下以前的代码,然后写下,记录下,事务失效其实除特殊情况下,比如方法需要save,update等,还有运行异常上抛出等,其实还有一个大家都不注意,就是如果方法内部再次调用内部方法,事务也是可能要无效 @Service("CancelService ") public class CancelServiceImpl imp...

阿G 1844

Spring service本类中方法调用另一个方法事务不生效问题

[问题]       Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring AOP啊,事务管理真轻松啊,真轻松;事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务;轻量级,测试起来也简单,嘿!”。不管从哪个角度看,轻量级声明式事务都是一件解放生产力的大好事。所以,我们“一直用它”。       不过,最近的一个项目里,却碰到了一个事务管理上的问题:有一个服务类,其一...

两个陌生人 1万+

Spring service调用当前类方法导致事务不生效

最近在项目中遇到一个问题,在service类中调用当前类的一个方法,没有开启事务,如下: @Service("userService") public class UserServiceImpl implements UserService{ @Autowired private UserMapper userMapper; //默认情况下Spring的声明式事务对所有的运行时异常进...

uk8692的专栏 2047

Spring事务内方法调用自身事务 增强的三种方式

ServiceA.java文件: 查看Spring Tx的相关日志: 可以看到只创建了一个事物ServiceA.service方法的事务,但是callSelf方法却没有被事务增强; 分析原因:Spring事务生成的对象也是被Cglib或JDK代理的对象,就区别于该对象本身了, 代理的对象执行方法之前会走拦截器链,就不能同this方法. ...

aar49191的博客 1001

spring 声明式事务方法自调用问题

这是我自己在学习sprng 声明式事务时遇到我的问题在Spring框架中,使用注解可以声明一个方法或类需要在事务的上下文中执行。然而,当你将注解应用于一个方法(如),并且这个方法内部调用了其他带有注解的方法(如changeAge和changeName)时,Spring默认不会为这些内部调用创建新的事务或加入当前事务的上下文中。这是因为Spring的注解是基于AOP(面向切面编程)实现的,而AOP代理通常只在外部调用时才会生效。当方法内部调用changeAge或changeName。

小鱼儿的博客 1219
上一篇: LeetCode-344-反转字符串
下一篇: rabbitmq五种工作模式
huapro.vip
博客等级 码龄15年 36粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值