SpringBoot使用@Async注解失效分析(@Transactional事务注解失效分析)

关于 CompletableFuture.runAsync 异步下 @Transactional 事务失效问题 及其解决方案 异步下事务失效解决方案 阅读详情

有时候在使用的过程中@Async注解会失效(原因和@Transactional注解有时候会失效的原因一样)。

下面定义一个Service:

两个异步执行的方法test03()和test02()用来模拟项目中可能出现的耗时的操作,然后test()方法调用这两个耗时的方法:

定义Controller:

执行方法,返回结果:

方法执行结果明显与我们的预期不符,方法的输出顺序表示了test02()和test03()两个异步方法居然同步执行了,也就是说@Aysnc注解失效了!

失效的原因是因为我们是在test()方法中直接调用的test02()和test03()方法,相当于是this.test02()和this.test03()调用的,也就是说真正调用test02()和test03()方法的是TestService对象本身调用的,而@Async和@Transactional注解本质使用的是动态代理,真正应该是TestService的代理对象调用test02()和test03()方法。其实Spring容器在初始化的时候Spring容器会将含有AOP注解的类对象“替换”为代理对象(简单这么理解),那么注解失效的原因就很明显了,就是因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器,那么解决方法也会沿着这个思路来解决。

网上有不少博客说解决方法就是将要异步执行的方法单独抽取成一个类,这样的确可以解决异步注解失效的问题,原理就是当你把执行异步的方法单独抽取成一个类的时候,这个类肯定是被Spring管理的,其他Spring组件需要调用的时候肯定会注入进去,这时候实际上注入进去的就是代理类了,其实还有其他的解决方法,并不一定非要单独抽取成一个类。
 

解决方式一:在TestService中通过上下文获取自己的代理对象调用异步方法

其实我们的注入对象都是从Spring容器中给当前Spring组件进行成员变量的赋值,由于TestService使用了AOP注解,那么实际上TestService在Spring容器中实际存在的是它的代理对象。

工具类可以参考我的另一篇博客:https://blog.youkuaiyun.com/Dongguabai/article/details/80788646

 

我使用的此种方法,不过我是直接注入的ApplicationContext,以下是我的伪代码

public class MdController{

@Autowired

private ApplicationContext applicationContext;

@Transactional

public Object pub(){

MDSearchService  mDSearchService  =applicationContext.getBean(MDSearchService);

md.update();

}

}

@Service

public class MDSearchService  {

@Async

public void update();

}

aop切面配置时也是有事务必须用applicationaContext取bean去处理,如果切点的事务回滚了,切面也就不执行了

 

执行结果,异步方法异步执行了:

解决方式二:开启cglib代理,手动获取Spring代理类

在启动类上加上:

使用AopContext.currentProxy()获取当前代理类:

这里为了证明Spring容器中的对象就是当前代理类对象特地输出了一句话:

运行结果:

OK,问题完美解决!OK,问题完美解决!

OK,问题完美解决!

Springboot之@Transactional事务注解原理详解 文章目录注册事务切面逻辑根据切面逻辑生成代理类总结 @Transactional注解的逻辑是通过动态代理来实现的,而生成这个动态代理类分成了两步: 1、向spring容器注册事务相关的切面逻辑 2、根据切面逻辑生成动态代理 下面围绕这两点来看下Springboot里的实现原理 注册事务切面逻辑 切面逻辑里有三个概念: Pointcut:负责告诉spring容器哪个类需要增强 Advise:具体的切面逻辑,这里就是根据异常进行commit或者回滚的相关逻辑 Advisor:封装了Advise和Pointcut 阅读详情

相关推荐

NE555构成多谐振荡器及三角波、正弦波的生成(附工程文件)

NE555构成多谐振荡器及三角波、正弦波的生成 续上一篇:NE555基本原理及相关公式的推导

qq_49979053的博客 5万+

springboot @Transactional注解与@Async注解失效

常见事务失效原因: 1.内部调用(常见于同一个service引用了本service的方法,且最开始的方法没有打上注解) 2.没有指定监听的Exception(常见于抛出的异常非RuntimeException及其子类) 3.异常被方法内部try catch掉了,未向外抛出 4.方法不是public的 而我出现的场景并不在上述的原因列表中,且伴随着@Async注解也失效了,其实是由于Spring 的Aop失效导致的,并可观测出,在controller层拿到的springboot自动注入的serv

hero_lxz的博客 1588

计算机组成原理实验logisim(四)之运算器实验

注意,上半张图中所有连入32位宽多路选择器的器件和的“数据位宽”都是32,而中间部分连入1位多路选择器的器件的“数据位宽”皆为1(除了连向“32位加法器”的那一个非门,是32位)。第二到第五个实验的测试,具体怎么测试好吧我也不太清楚,听室友说就是让你分析各种亮灯的原理,比如你点这个,那个为什么颜色要变等等,我就不粘图了,恩大家加油。连图如下,需要在连线之前格外注意“异或门”和“与门”的位宽,将16改为1,不然数据无法通行。关于学术问题,为何这样连什么的,就别问我了,我也没有搞的那么透彻。

qq_54422132的博客 2万+

Spring @Async/@Transactional 失效的原因及解决方案

本来上一篇说要写关于AOP的实践的,但是这周刚好遇到了使用@Transactional和@Async的不生效的问题,这篇就进行一个回顾和记录。 之前提到实现AOP的方法有动态代理、编译期,类加载期织入等等,Spring实现AOP的方法则就是利用了动态代理机制,正因如此,才会导致某些情况下@Async和@Tra...

weixin_34245082的博客 780

【Python】SimpleITK使用笔记

1. 概念 1.1 nii格式 1.2 SimpleITK 1.3 SimpleITK 图像 2. 基本操作 2.1 常见属性 2.1 读取和保存图像 2.2 SimpleITK图像数据和Numpy矩阵数据之间的转换

See_Star的博客 7895

Isaac Sim仿真平台学习(2)系统架构

isaac sim系统架构

weixin_75067193的博客 2698

@Transactional,@Async 失效了?快来看看你是怎么中招的

第一次离职面试时,面试官开放式聊天,问到如果有一个新人,我怎么给他讲解事务的注意事项,从而让他少踩一些坑,当时没转过来思路,觉得配置对了就好了嘛,所以就聊了一下事务的传播行为和隔离级别,后来新的工作中同事遇到了@Async@Transactional无效的情况,借由这个想起了上述经历,分享一下 首先我们来了解@Transactional这个注解: @Transactional注解事务的特性: 1 .添加位置 1)接口实现类或接口实现方法上,而不是接口类中。因为启动事务会增加线程开销,所以基本都写在接口实现方

Ethan_199402的博客 902

手把手教你用Docker快速部署ZLMediaKit流媒体服务器(含WebRTC配置)

本文详细介绍了如何使用Docker快速部署ZLMediaKit流媒体服务器,并配置WebRTC功能。通过容器化部署,实现环境一致性、资源隔离和快速扩展,同时提供WebRTC专项配置、多协议推拉流实战测试及生产环境优化建议,帮助开发者高效搭建企业级流媒体平台。

agile9scrum的博客 202

SpringBoot-@Async-@EnableAsync-ApplicationContext与ApplicationListener搭配-ApplicationEvent创建响应式异步调用。

重写类需要被@Bean注入(可以用@Component等价注解代替)。函数上添加@Async可以让这个函数使用类似单独线程资源独立执行从而不影响函数的主流程。使用ApplicationContext的实例函数publishEvent(ApplicationEvent)发布函数就可以唤醒ApplicationListener执行onApplicationEvent(Event)函数。ApplicationEvent是抽象类,是ApplicationListener接口的模板函数类型。

qq_45568546的博客 435

大数据在电力行业的应用案例解析 -【电力技术】(十)电力数字化运营与大数据精准服务体系建设

电力数字化运营,是大数据在电力行业从技术场景走向业务价值的最终落点。它以数据为纽带,将用户、设备、服务、收益、风险全部纳入统一闭环,实现从 “管好电” 向 “运营好能源资产” 升级。在新型电力系统与市场化改革双重驱动下,谁能用好数据、建好闭环、做好运营,谁就能在服务、成本、效益、安全上建立长期优势。

getusushu的博客 69

GlobalBuildingAtlas 建筑物白模数据下载

GlobalBuildingAtlas基于OSM开源数据构建全球建筑物3D白模,提供在线浏览和下载服务。官方资源包括GitHub项目地址和TUM数据库链接,支持行政区划检索建筑物数据。

一醉千秋的专栏 540

Java--SpringBoot使用@Transactional注解添加事务

一、Java事务 1、通常的观念认为,事务仅与数据库相关。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。 事务的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。 事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。 事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。 事务

MinggeQingchun的博客 3万+

从一个 ASIN 看透亚马逊:商品模型背后的增长飞轮

在亚马逊电商体系中,每件商品背后都有一套严密的商品建模逻辑。本篇文章以“ASIN 的一生”为线索,系统拆解了亚马逊的商品模型:从飞轮战略出发,剖析 SDP(Single Detail Page)机制如何实现标准化展示;再到 ASIN 编码、父子变体结构与 Offer 分离模型,逐层解析商品信息如何被建构、聚合与呈现。通过图解与案例,文章帮助读者理解商品建品流程、同款聚合原则、价格控制机制等核心逻辑,避免常见运营误区,是一份面向运营、产品、技术人员的实用参考指南。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

SpringBoot 事务注解@Transactional

SpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,非常方便快捷,下面我们就说一下如何进行事务操作。 1. 事务说明 在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式。 编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,...

程序猿踩坑集锦 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

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

SpringBoot 使用 @Transactional 注解配置事务

pringBoot项目中需要配置事务管理,所以在这里系统地整理下关于@Transactional 注解相关的知识。 1、详细介绍 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。 编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不...

大树叶 技术专栏 6197

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

springboot的异步调用@Async和事务@Transactional注解的注意事项

场景描述:我司最近要做一个上传Word转图片,实现预览Word的功能,整体流程为用户前端上传word文件,上传成功之后即提示成功,Java后台异步调用转图片服务。 伪代码: controller层:接收上传文件 serviceImpl层:1.上传文件->2.上传成功->3.异步调用转图片服务 以前只知道springboot中异步调用使用@Async注解,并且被注解标注的方法必须...

本博客已迁移到 https://jacksparrow414.com 9411

IEM模型,地表粗糙度模拟

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

SpringBoot事务注解@Transactional

SpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,非常方便快捷,下面我们就说一下如何进行事务操作。1. 事务说明在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式。 编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。

Kenny的专栏 12万+

Spring Boot 中使用 @Transactional 注解配置事务管理

Spring Boot 中使用 @Transactional 注解配置事务管理

weixin_40497755的博客 3492

springboot中使用@Transactional注解事物不生效的原因

一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物。顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明。另一种是声明式事物,分为两种情况01:一种是通过传统xml方式配置,02:使用@Transaction注解方式配置,这是主要讲解的是通过注解方式配置。因为在springboot项目中,会自动配置DataSour...

Z__Sheng的博客 2万+

spring boot- 异步@Async + 事务@Transactional 组合使用测试

文章目录spring boot- 异步@Async + 事务@Transactional 组合使用测试demo1测试: @Transactional 方法中调其他服务的@Async方法 spring boot- 异步@Async + 事务@Transactional 组合使用测试 demo1测试: @Transactional 方法中调其他服务的@Async方法 @Slf4j @Service public class TestService { @Autowired SysRoleRep

西京刀客 4425

事务——mysql事务以及注解@Transactional

如果其中有一条SQL语句失败,就进行事务的回滚,所有的SQL语句全部执行失败。所谓事务的传播行为,指的就是在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方法, B方法自身也具有事务,那么B方法在运行的时候,到底是加入到A方法的事务当中来,还是B方法在运行的时候新建一个事务?总结一下,使用rollbackFor属性可以精确地控制事务回滚的条件,可以指定在哪些异常情况下触发回滚操作,从而保证数据的一致性和完整性。就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

abc2003_的博客 1578
上一篇: MySql排序查询将null放在最后的解决办法
下一篇: spring中使用xml作为配置文件时@Async和@Transactional不起作用的情形
qq_34412985
博客等级 码龄11年 143粉丝 983原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值