Spring事务调用类自己方法失效解决办法和原因
问题
正常情况下,我们都是在controller里调用service里的方法,这个方法如果需要加事务,就在方法上加上@Transactional,这样是没问题的,事务会生效。
可是如果像下面这样,绕以下,service里方法调用了自己类的方法,这个时候即使加了@Transactional,事务也不会生效。
@Controller
public class TestController { @Autowired
private TestService testService; @GetMapping("/test")
public void test(){
testService.methodB();
} }
@Service
public class TestService { @Transactional
public void methodA(){ } /**
* 这里调用methodA() 的事务将会失效
*/
public void methodB(){
this.methodA();
} }
原因
因为,spring的事务实现是使用了代理类来实现,而这里的this.methodA(),并没有走TestService的代理类,所以事务会失效。
解决
方法1:把methodA()和methodB()分别放到不同的类里。
方法2:自己注入自己,用注入的实例调用
@Service
public class TestService { @Autowired
private TestService testService; @Transactional
public void methodA(){ } /**
* 这里调用methodA() 的事务将会生效
*/
public void methodB(){
testService.methodA();
} }
方法3:获取代理类,利用代理类调用自己类的方法
@Service
public class TestService { @Transactional
public void methodA(){ } /**
* 这里调用methodA() 的事务将会生效
*/
public void methodB(){
((TestService)AopContext.currentProxy()).methodA();
} }
最后
spring的aop代理有jdk代理和cglib代理实现,具体参阅java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
//是否代理对象
AopUtils.isAopProxy(AopContext.currentProxy()); //是否cglib 代理对象
AopUtils.isCglibProxy(AopContext.currentProxy()); //是否jdk动态代理
AopUtils.isJdkDynamicProxy(AopContext.currentProxy());
Spring事务调用类自己方法失效解决办法和原因的更多相关文章
- iOS:didSelectRowAtIndexPath:方法失效解决办法
问题描述及解决过程: 为了达到点击TableView空白区退出键盘的效果,给控制器注册了一个UITapGestureRecognizer来识别点击事件,代码如下: #pragma mark - 设置手 ...
- C++ 11 线程调用类的成员函数解决办法
在C++中,_beginthreadex 创建线程是很麻烦的.要求入口函数必须是类的静态函数. 通常,可以采用thunk,或者模板来实现. 因C++ 11中引入了 std::async ,可以很好的解 ...
- 一个页面上调用多个setInterval失效解决办法(使用于同一时间间隔)
将方法封装在一起,只调用一个setInterval window.setInterval( function () { $.ajax({ type: "GET", url: '/M ...
- Android开发教程 - 使用Data Binding Android Studio不能正常生成相关类/方法的解决办法
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...
- Java动态调用类中方法
在Java中,调用类的方法有两种方式:对于静态方法可以直接使用类名调用,对于非静态方法必须使用类的对象调用.反射机制提供了比较另类的调用方式,可以根据需要指定要调用的方法,而不必在编程时确定.调用的方 ...
- C#通过反射调用类及方法
反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类).下面演示一下通过反射调用类及方法: 1.新建一个类,命名为:ReflectionHelper,代码如下: #region 创 ...
- 基于Spring框架的简单多数据源切换解决办法
基于Spring框架的简单多数据源切换解决办法 Spring框架JDBC包提供了一个抽象类AbstractRoutingDataSource提供了动态切换数据库的基础方法.我们仅仅需要实现一个简单的数 ...
- Xcode升级插件失效解决办法-升级版
Xcode升级插件失效解决办法 每每升级Xcode,第三方插件总是中枪.解决办法也基本是依据http://joeshang.github.io/2015/04/10/fix-xcode-upgrade ...
- MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 的解决办法和原因
这两天下载了MySQL5.7.11进行安装,发现到了初次使用输入密码的时候,不管怎样都进不去,即使按照网上说的在mysqld 下面添加skip-grant-tables也是不行,后来研究了两天,终于找 ...
随机推荐
- CentOS 配置阿里云 yum 源
CentOS 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的Cent ...
- Java生鲜电商平台-销售管理设计与架构
Java生鲜电商平台-销售管理设计与架构 说明:在Java开源生鲜电商平台中,销售人员我们称为跟餐饮店老板沟通与下载APP的一类地推人员.(所谓地推指的就是一个一个上门拜访.) 由于销售人员有以下几类 ...
- FastReport的模板文件frx文件啊怎样打开并编辑修改
场景 FastReport安装包下载.安装.去除使用限制以及工具箱中添加控件: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- https申请证书并部署到网站流程,浏览器验证证书流程
https申请证书并部署到网站流程: 1.生成一对秘钥,设公钥为pubk1,私钥为prik12.假设发布的网站地址为https://www.example.com3.生成一个CSR文件(Cerific ...
- Eclipse 笔记
2004年前的开发架构:(操作系统+数据库+中间件+开发工具) AIX + DB2 + WAS + WSAD === 皇家级 UNIX/Linux + Oracle +BEA WebLogic + ...
- Scrum冲刺第四篇
一.每日例会 会议照片 成员 昨日已完成的工作 今日计划完成的工作 工作中遇到的困难 陈嘉欣 撰写博客,管理成员提交代码 和队友一同开发音乐控制模块 对音频控制方面知识了解少,功能实现困难 邓镇港 帮 ...
- LeetCode——Employees Earning More Than Their Managers
The Employee table holds all employees including their managers. Every employee has an Id, and there ...
- Spring事务部分知识点整理
目录 1.数据库事务基础概念 2.Spring中注解事务的使用 3.Spring事务使用注意场景 1.数据库事务基础概念 数据库事务是对数据库一次一系列的操作组成的单元,可以包含增删改查或者只有单 ...
- SQL注入:宽字节注入
了解GBK编码 尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范.但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的 ...
- postgreSQL 自动递增序号
创建表格 CREATE TABLE test ( id serial, name ) not null ); 查询当前创建好的表格 插入数据 BEGIN TRANSACTION; INSERT INT ...