Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何解决Transaction 注解,方法内部调用无效问题

如何解决Transaction 注解,方法内部调用无效问题

作者头像
海涛
发布于 2020-02-12 16:06:14
发布于 2020-02-12 16:06:14
1.8K00
代码可运行
举报
文章被收录于专栏:海涛技术日常海涛技术日常
运行总次数:0
代码可运行

前提:

Transaction 注解开启事务,是通过代理对象对方法进行封装开启和关闭事务,但生效的的条件是外部调用,而内部调用并不会走代理对象,这就造成了事务失效。

解决办法:

1.逻辑优化,避免内部调用(自己评估)

2.通过AopContext.currentProxy()获取当前类的代理对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
((ArticleService)AopContext.currentProxy()).getArticleById(id);

注意:需要设置 exposeProxy=true

配置方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<aop:aspectj-autoproxy proxy-target-class="true"expose-proxy="true"/>

注解方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy=true)
public class DatacenterApplication {
    public static void main(String[] args) {
        SpringApplication.run(DatacenterApplication.class, args);
    }

}

3.手动获取bean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class SpringUtils  implements ApplicationContextAware {

        private static ApplicationContext applicationContext;
        @Override
        public void setApplicationContext(ApplicationContext applicationContextParam) throws BeansException {
            applicationContext=applicationContextParam;
        }
        public static Object getObject(String id) {
            Object object = null;
            object = applicationContext.getBean(id);
            return object;
        }
        public static <T> T getObject(Class<T> tClass) {
            return applicationContext.getBean(tClass);
        }

        public static Object getBean(String tClass) {
            return applicationContext.getBean(tClass);
        }

        public <T> T getBean(Class<T> tClass) {
            return applicationContext.getBean(tClass);
        }
}

附件:方式三 也可以参考 https://blog.csdn.net/qq_26631651/article/details/89290856 这种获取 bean的方式

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring AOP 实现 原
AOP(Aspect Orient Programming),我们一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务、日志、缓存、分布式锁等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。Spring的主要动态代理有CGLib和JDK自动代理。
chinotan
2019/04/03
4390
Spring AOP 实现
                                                                            原
Spring读源码系列之AOP--08--aop执行完整源码流程之自动代理创建器导入的两种方式
下面这篇文章讲过spring的标签解析过程,aop:aspectj-autoproxy严格来说属于自定义标签, spring默认和自定义标签的解析过程
大忽悠爱学习
2022/05/10
6650
Spring读源码系列之AOP--08--aop执行完整源码流程之自动代理创建器导入的两种方式
从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案【享学Spring】
本文标题包含有'靓丽'的字眼:Spring框架bug。相信有的小伙伴心里小九九就会说了:又是一篇标题党文章。 鉴于此,此处可以很负责任的对大伙说:本人所有文章绝不哗众取宠,除了干货只剩干货。
YourBatman
2019/09/03
16K5
跨语言深入探讨如何实现方法增强:Java & Go的多策略实现
猫头虎博主在此!👋 大家好,我是一只始终对技术保持着无限热爱的猫头虎。今天,我将带大家深入探讨在Java和Go语言中的方法增强技术。你是否在搜索如何在类内部调用另一个有注解的方法?🔍 或是怎样在Go中通过不同的设计模式来实现方法的增强呢?不必再苦恼,这篇博文将为你提供一站式的解决方案!拿起你的☕️,一起来学习吧!
猫头虎
2024/04/09
1230
跨语言深入探讨如何实现方法增强:Java & Go的多策略实现
详细整理Spring事务失效的具体场景及解决方案
实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制;好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Spring事务失效的场景,希望开发过程尽量避免踩坑,造成时间精力的浪费。 溪源按照最基本的使用方式以及常见失效场景优先级整理,先简单介绍一下具体失效场景:
沁溪源
2020/09/02
1.2K0
SpringBoot中异步请求和异步调用(看这一篇就够了)
可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。
Java团长
2019/12/25
3.3K0
SpringBoot中异步请求和异步调用(看这一篇就够了)
SpringAop源码分析(基于注解)一
关于Aop的原理,简单来讲无非就是用代理模式为目标对象生产代理对象,对原有的方法进行增强。看上去挺简单,但在Spring中,有许多细节是要注意到的。比如:
周同学
2019/10/24
4910
Spring AOP注解为什么失效?90%Java程序员不知道
使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效。 如下面几种场景 1、Controller直接调用Service B方法:Controller > Service A 在Service A 上加@Transactional的时候可以正常实现AOP功能。 2、Controller调用Service A方法,A再调用B方法:Controller > Service A > Service B 在Service
Java技术栈
2018/03/30
1.4K0
完整剖析SpringAOP的自调用
spring全家桶帮助java web开发者节省了很多开发量,提升了效率。但是因为屏蔽了很多细节,导致很多开发者只知其然,不知其所以然,本文就是分析下使用spring的一些注解,不能够自调用的问题。因为本身这类文章很多,所以有些地方不会详述,直接引用其他文章。
方丈的寺院
2019/09/18
7270
完整剖析SpringAOP的自调用
事务没回滚?来,我们从现象到原理一起分析一波!
需求是有两个表,分别是订单表和订单附加信息表,其中订单表一定要落数据,订单附加信息表保存的时候如果有异常,则回滚,但是不能影响订单表的数据。
why技术
2019/09/18
6160
事务没回滚?来,我们从现象到原理一起分析一波!
阿里四面:你知道Spring AOP创建Proxy的过程吗?
Spring在程序运行期,就能帮助我们把切面中的代码织入Bean的方法内,让开发者能无感知地在容器对象方法前后随心添加相应处理逻辑,所以AOP其实就是个代理模式。 但凡是代理,由于代码不可直接阅读,也是初级程序员们 bug 的重灾区。
JavaEdge
2021/12/07
4850
阿里四面:你知道Spring AOP创建Proxy的过程吗?
Spring Aop标签解析原理详解
对于Spring Aop的实现,是非常复杂的,其实现过程主要包含xml标签的解析,切面表达式的解析,判断bean是否需要应用切面逻辑,以及使用Jdk代理或者是Cglib代理生成代理类,本文主要讲解Xml标签的解析的实现原理。
JavaQ
2019/05/30
5430
(六)Spring源码解析:Spring AOP源码解析
当我们对某些类有横切性的逻辑时,为了不破坏目标类,我们则可以使用AOP的方式将增强逻辑注入到目标类上。为了更清晰的了解AOP的用法,下面我们通过一个使用案例,实现一下面向切面编程。
爪哇缪斯
2023/09/06
7810
(六)Spring源码解析:Spring AOP源码解析
@Transactional 你真的用对了吗?
某天我在做自己的需求时,发现有一个同事写的老接口(Ps:此处真的是我有一个同事😶)里的一行代码IDE有个警告提示,本来也没在意,以为就是个格式检查,但是瞄了一眼,发现不对劲,提示的是:
别惹CC
2025/01/14
1730
SpringBoot - 优雅的处理【长事务】
在Spring体系中,在方法上加上注解@Transactional,Spring自动帮我们进行事务的开启、提交、回滚操作,真的是太方便了,以至于不分青红皂白,啥都搞上…
小小工匠
2022/03/10
2.1K0
SpringBoot - 优雅的处理【长事务】
Spring源码之AOP的使用
我们都知道 Java 是一门面向对象(OOP)的语言,所谓万物皆对象。但是它也存在着一些个弊端:当你需要给多个不具有继承关系的对象引入同一个公共的行为的时候,例如日志,安全检测等等,我们只能在每个对象中去引入这个公共行为,这样就产生了大量的重复代码,并且耦合度也会很高,不利于维护。正因如此就产生了面向切面(AOP)编程。可以说有了 AOP 使得面向对象更加完善,是对其的一个补充,AOP 所关注的方式是横向的,不同于 OOP 的纵向,接下来我们详细讲解一下 spring 中的 AOP。
@派大星
2023/06/28
1600
Spring源码之AOP的使用
SpringBoot 内部方法调用,事务不起作用的原因及解决办法
在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。
曾高飞
2022/08/15
2.6K0
基于注解的SpringAOP源码解析(一)
本文会分析Spring的AOP模块的整体流程,分析过程需要使用一个简单的demo工程来启动Spring,demo工程我以备好,需要的童鞋自行在下方链接下载:
Java学习录
2019/08/19
5680
@Transactional 自调用失效问题解析
”脏脏包“在技术群里问了一个问题:”大家有在项目中遇到这样的场景吗 在一个service层重写的方法中调用一个私有方法。 service重写的方法不加事务 私有方法想加入事务 他去调用私有方法时 私有方法需要被事务控制“ 。
明明如月学长
2021/08/31
1.2K0
@Transactional 自调用失效问题解析
aop:aspectj-autoproxy
因为AopDemo实现了AopDemoInter接口,但做实验的send方法又不在此接口里定义,所以只能用cglib的方式代理。
MickyInvQ
2021/10/18
8260
推荐阅读
相关推荐
Spring AOP 实现 原
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验