SpringBoot 内部方法调用,事务不起作用的原因及解决办法

【BUG】@Transactional注解在同类方法调用中不生效 后台代码 今天做系统开发的时候,遇到了一个BUG:@Transactional注解在同类方法调用中不生效 代码如下: /** * @description: 快递100接口服务类 * @date 2021/11/23 */ @Service public class SysExpressServiceImpl implements ISysExpressService { /** * 处理快递100推送请求并响应 * @param request 快递100的推送请求 阅读详情
AI摘要

在业务开发中遇到一个问题,当定时任务内部调用一个带事务的方法时,事务在异常发生后未能回滚。问题源于内部方法使用`this`调用,未经过AOP代理,导致事务失效。解决方法包括:1) 通过@Autowired注入自身bean调用;2) 使用ApplicationContext获取bean调用;3) 利用AopContext获取当前类代理。以上三种方式都能确保事务正常工作。

在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。

场景

我在这里模拟一个场景,大概的调用方式就如下面的代码这样。

@Override
@Transactional(rollbackFor = RuntimeException.class)
public void insertUser(User user) {
    userMapper.insertUser(user);
    throw new RuntimeException("");
}

/**
 * 内部调用新增方法
 *
 * @param user
 */
@Override
public void invokeInsertUser(User user) {
    this.insertUser(user);
}

原因

AOP使用的是动态代理的机制,它会给类生成一个代理类,事务的相关操作都在代理类上完成。内部方式使用this调用方式时,使用的是实例调用,并没有通过代理类调用方法,所以会导致事务失效。

解决办法

方法一 引入自身bean

在类内部通过@Autowired将本身bean引入,然后通过调用自身bean,从而实现使用AOP代理操作。

注入自身bean

@Autowired
@Lazy
private UserService service;

修改invokeInsertUser方法

/**
 * 解决方法一 在bean中将自己注入进来
 * @param user
 */
@Override
public void invokeInsertUser(User user) {
    this.service.insertUser(user);
}

方法二 通过ApplicationContext引入bean

通过ApplicationContext获取bean,通过bean调用内部方法,就使用了bean的代理类。

注入ApplicationContext

@Autowired
ApplicationContext applicationContext;

修改invokeInsertUser方法

/**
 * 解决方法二 通过applicationContext获取到bean
 * @param user
 */
@Override
public void invokeInsertUser(User user) {
    ((UserService)applicationContext.getBean("userService")).invokeInsertUser(user);
}

方法三 通过AopContext获取当前类的代理类

通过AopContext获取当前类的代理类,直接通过代理类调用方法

在引导类上添加@EnableAspectJAutoProxy(exposeProxy=true)注解

修改invokeInsertUser方法

/**
 * 解决方法三 通过AopContext获取到bean
 *
 * @param user
 */
@Override
public void invokeInsertUser(User user) {
    ((UserService) AopContext.currentProxy()).invokeInsertUser(user);
}

以上就是内部方法调用时,事务不起作用的原因及解决办法。

Spring同一个class类中的@Transactional事务调用另一个事务不生效的解决方案 同一个class类,在事务方法中调用另外一个事务方法,被调用方法的事务不生效 阅读详情

相关推荐

PCIe信号眼图总是不开?手把手教你调CTLE和DFE参数(附实测波形对比)

本文详细解析了PCIe信号眼图调试中CTLE和DFE参数的优化方法,帮助硬件工程师解决眼图无法张开的问题。通过实际案例和步骤指导,介绍了如何调整CTLE直流增益和DFE抽头系数,提升接收端均衡器性能,确保信号完整性。

weixin_26805597的博客 213

@Transactional失效——同一个类中方法调用导致,解决方案!

@transaction注解失效的6种场景:https://blog.youkuaiyun.com/zhangkaixuan456/article/details/108882496 同一个类中方法调用,导致@Transactional失效 开发中避免不了会对同一个类里面的方法调用,比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错误的一个地方。 .

zhangkaixuan456的博客 1万+

openEuler 22.03 LTS SP4离线安装UKUI桌面全攻略(附依赖包下载)

本文提供openEuler 22.03 LTS SP4系统离线安装UKUI桌面环境的完整实战指南。针对无网络环境,详细解析了利用dnf工具下载依赖包、配置离线软件源、处理依赖冲突及安装后优化的全流程,并附带了关键依赖包资源,帮助运维人员高效完成图形化部署。

c7d8e9的博客 477

@Transactional注解在同一个类中的方法之间调用不生效

解决方法1: 将事务方法放到另一个类中(或者单独开启一层,取名“事务层”)进行调用,即符合了在对象之间调用的条件。 解决方法2: 获取本对象的代理对象,再进行调用。具体操作如: Spring-content.xml上下文中,增加配置:<aop:aspectj-autoproxy expose-proxy=“true”/> 在xxxServiceImpl中,用(xxxService)(AopContext.currentProxy()),获取到xxxService的代理类,再调用事务方法,

mufan0216的博客 1898

基于STM32F407的立创球形六足双形态机器人:从Morphex复刻到毕业设计的完整开发指南

本文详细介绍了基于STM32F407主控芯片,从零开始复刻Morphex球形六足双形态机器人的完整开发过程。内容涵盖硬件选型(如总线舵机)、机械结构设计(阿基米德螺旋底盘)、软件控制(逆运动学与步态算法)以及多控制方式集成,为嵌入式系统与机器人开发的毕业设计或爱好者提供了全面的实战指南。

weixin_35414260的博客 321

plotly包安装_Plotly(一)安装指南

plotly,是一个快速完善并崛起的交互式的、开源的绘图库库,Python库则是它的一个重要分支。现已支持超过40种独特的图表类型,涵盖了广泛的统计、金融、地理、科学和三维用例。Plotly 通过JavaScript构建,能基于Web显示实现交互式的可视化效果(Plotly最强大之处之一)。所以它的图形呈现可以方便的显示于Jupyter notebook(基于html)、独立的html中(直接显示...

weixin_35907189的博客 3467

@Transactional类内部访问失效原因详解

Spring之所以可以对开启@Transactional的方法进行事务管理,是因为Spring为当前类生成了一个代理类,然后在执行相关方法时,会判断这个方法有没有@Transactional注解,如果有的话,则会开启一个事务。 也就是说我们首先调用的是AOP代理对象而不是目标对象,首先执行事务切面,事务切面内部通过TransactionInterceptor环绕增强进行事务的增强,即进入目标方法之前开启事务,退出目标方法时提交/回滚事务。 Spring在扫描bean的时候,如果扫描到方法上有这些注解

Ahuuua的博客 6412

VScode利用EIDE和cortex-debug进行stm32开发(也适用51)

你是否因为keil页面太丑而烦恼,你是否因为keil编译太慢而恼怒,ok阿,今天也是给大家带来怎么在vscode上进行stm32的编程(我不会告诉你,我搞了好几天才搞好的💔💔💔)为什么是简单介绍?因为太啰嗦了,我嫌麻烦😋,大家可以去EIDE的官方文档去看。

weixin_73952614的博客 9380

springboot 调用方法事物_SpringBoot 内部方法调用,事务不起作用的原因及解决办法...

在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。场景我在这里模拟一个场景,大概的调用方式就如下面的代码这样。@Override@Transactional(rollbackFor = RuntimeException.class)public void insertUser(...

weixin_39954487的博客 1007

嵌入式充电协议深度解析:从QC到PD3.1的技术演进与实战应用

本文深入解析了从QC到PD3.1的嵌入式充电协议技术演进与实战应用。通过电压谈判、协议芯片设计、Type-C接口优化等关键技术,详细介绍了快充协议在嵌入式系统中的实现挑战与解决方案,包括兼容性测试、EMC问题处理及空间限制创新设计,为开发者提供了宝贵的实践经验。

weixin_29194817的博客 419

使用C++实现DNS欺骗攻击

其中,domain_name表示需要欺骗的域名,dns_server_ip表示实际DNS服务器的IP地址,fake_ip表示需要重定向到的IP地址。在DNS查询过程中,当客户端向DNS服务器请求解析某个域名时,DNS服务器会返回该域名对应的IP地址。DNS劫持是一种常见的网络攻击方式,通过篡改DNS响应数据,使得用户访问的网站被重定向到攻击者指定的恶意站点。我们使用C++编写一个简单的DNS欺骗程序,使得当客户端请求解析特定的域名时,我们可以将其重定向到指定的IP地址。使用C++实现DNS欺骗攻击。

TechGlide的博客 411

SpringBoot、Spring内部(例如:service层内部调用)方法调用,事务不起作用的原因以及解决办法

SpringBoot、Spring内部(例如:service层内部调用)方法调用,事务不起作用的原因以及解决办法

吴名氏的博客 14万+

CDDT CST CDDT CSTTT

This is the second part of the SA8653 automotive CDDT configuration guide. It describes the matching rules and modification methods between CDDT and device‑tree DDTS. It explains CDT’s underlying logic and configuration in TZ, QNX and Android. It details C

qq_39257814的博客 1408

内部方法调用,事务不起作用的原因及解决办法

在做业务开发时,遇到了一个事务不起作用的问题。事情是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。 场景 我在这里模拟一个场景,大概的调用方式就如下面的代码这样。 @Override @Transactional(rollbackFor = RuntimeException.class) public ...

平头哥的技术博文 7648

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring的事务 方法A调用方法B,事务是否失效

springboot的有事务方法调用没有方法的事务,事务是否失效?

lzq2357639195的博客 1万+

ssm框架搭建

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

springboot 调用方法事物_SpringBoot内部调用事务不起作用问题的解决方案

在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。场景我在这里模拟一个场景,大概的调用方式就如下面的代码这样。@Override@Transactional(rollbackFor = RuntimeException.class)public void insertUser(...

weixin_28813357的博客 748

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

springboot同一个类里的方法之间调用事务不起作用

今天在看项目代码的时候,发现在service层,有方法调用同类中的方法,SonarLint提示有bug。 下图是我自己做测试时写的demo代码: 经过测试发现,当A方法调用同类中带有@Transactional注解的B方法时,被@Transactional注解的B方法的事务是不起作用的。 原因: spring会扫描@Transactional的类和方法,并通过动态代理实现启动事务的代理方法。 这...

qq_37170583的博客 6223

SpringBoot内部方法调用事务方法事务不回滚

在开发中往往会遇到事务问题,当我们必须保证事务的时候,可以在进行具体的保存方法上面加上Spring的事务注解***@Transactional***,即如下的方式: public class SomeServiceImpl implement ISomeService { @Override @Transactional public void save() { do saving....

人生有梦,未来可期 5338
上一篇: 【同程艺龙面经】一年Java开发经验面经(部门老大面)
下一篇: 一篇文章彻底弄懂零拷贝底层原理
CoderBruis
博客等级 码龄10年 4444粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值