SpringBoot内部调用事务不起作用问题的解决方案
在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。
场景
我在这里模拟一个场景,大概的调用方式就如下面的代码这样。
@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
方法
/** * 解决方法三 通过applicationContext获取到bean * * @param user */ @Override public void invokeInsertUser(User user) { ((UserService) AopContext.currentProxy()).invokeInsertUser(user); }
以上就是内部方法调用时,事务不起作用的原因及解决办法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
详解springboot-修改内置tomcat版本
详解springboot-修改内置tomcat版本 1.解析Spring Boot父级依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> </parent> 这块配置就是Spring
-
springboot配置内存数据库H2教程详解
业务背景:因soa系统要供外网访问,处于安全考虑用springboot做了个前置模块,用来转发外网调用的请求和soa返回的应答.其中外网的请求接口地址在DB2数据库中对应专门的一张表来维护,要是springboot直接访问数据库,还要专门申请权限等,比较麻烦,而一张表用内置的H2数据库维护也比较简单,就可以作为替代的办法. 环境:springboot+maven3.3+jdk1.7 1.springboot的Maven工程结构 说明一下,resource下的templates文件夹没啥用.我忘记
-
SpringBoot 注解事务声明式事务的方式
springboot 对新人来说可能上手比springmvc要快,但是对于各位从springmvc转战到springboot的话,有些地方还需要适应下,尤其是xml配置.我个人是比较喜欢注解➕xml是因为看着方便,查找方便,清晰明了.但是xml完全可以使用注解代替,今天就扒一扒springboot中事务使用注解的玩法. springboot的事务也主要分为两大类,一是xml声明式事务,二是注解事务,注解事务也可以实现类似声明式事务的方法,关于注解声明式事务,目前网上搜索不到合适的资料,所以在这里
-
详解SpringBoot的事务管理
Springboot内部提供的事务管理器是根据autoconfigure来进行决定的. 比如当使用jpa的时候,也就是pom中加入了spring-boot-starter-data-jpa这个starter之后. Springboot会构造一个JpaTransactionManager这个事务管理器. 而当我们使用spring-boot-starter-jdbc的时候,构造的事务管理器则是DataSourceTransactionManager. 这2个事务管理器都实现了spring中提供的Pl
-
SpringBoot获取yml和properties配置文件的内容
(一)yml配置文件: pom.xml加入依赖: <!-- 支持 @ConfigurationProperties 注解 --> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor --> <dependency> <groupId>org.springframework.boot</groupId>
-
SpringBoot2.0 整合 Dubbo框架实现RPC服务远程调用方法
一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互. 2)图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点. 3)图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用. 4)图中只包含 RPC
-
springboot整合cxf发布webservice以及调用的方法
webservice性能不高,但是现在好多公司还是在用,恰好今天在开发的时候对接项目组需要使用到webservice下面来说下简单的案例应用 首先老规矩:引入jar包 <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version>3.1.11</version> &
-
详解SpringBoot中异步请求和异步调用(看完这一篇就够了)
一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应.一句话:增加了服务器对客户端请求的吞吐量(实际生产上我们用的比较少,如果并发请求量很大的情况下,我们会通过nginx把请求负载到集群服务的各个节点上来分摊请求压力,当然还可以通过消息队列来做请求的缓冲). 2.异步请求的实现 方式一:Servlet方式实现异步请求
-
SpringBoot内部调用事务不起作用问题的解决方案
在做业务开发时,遇到了一个事务不起作用的问题.大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚.查阅资料后,问题得到解决,记录下来分享给大家. 场景 我在这里模拟一个场景,大概的调用方式就如下面的代码这样. @Override @Transactional(rollbackFor = RuntimeException.class) public void insertUser(User user) { userMapper.insertUser(user); thr
-
解决springboot的aop切面不起作用问题(失效的排查)
检查下springboot的启动类是否开启扫描 @SpringBootApplication @ComponentScan(basePackages = {"com.zhangpu.springboot"}) 另外springboot默认开启的EnableAspectJAutoProxy为true 如果不放心可以增加: @EnableAspectJAutoProxy(proxyTargetClass=true) 第二种可能: 没有导入 相关的jar <dependency>
-
java中构造器内部调用构造器实例详解
可能为一个类写了多个构造器,有时可能想在一个构造器里面调用另外一个构造器,为了减少代码的重复,可用this关键字做到这一点. public class Flower { private String string; private int age; public Flower() { // 先调用public Flower(String string, int age) this("leon", 120); // 先调用public Flower(String string, int
-
SpringBoot声明式事务的简单运用说明
关于事物的基本概念等这里就不介绍了. Spring声明式事物的实现,有两种方式:第一种是配置xml,第二种是使用相关注解(这两种方式可详见<程序员成长笔记(一)>的相关章节).SpringBoot中默认配置了第二种方式,所以,SpringBoot直接使用注解即可.下面介绍SpringBoot通过注解开启事物的使用. SpringBoot使用事物的步骤: 第一步:在启动类上开启事物支持 提示: @EnableTransactionManagement注解其实在大多数情况下,不是必须的,因为Spr
-
SpringBoot Shiro 权限注解不起作用的解决方法
最近在学习springboot结合shiro做权限管理时碰到一个问题. 问题如下: 我在userRealm中的doGetAuthorizationInfo方法中给用户添加了权限,然后在Controller中写了下面的代码.其中URL为/listArticle的方法必须要有article:over权限才能通过.我在doGetAuthorizationInfo方法中给该用户添加的权限并没有article:over,但是当前端向该URL发送请求时,@RequiresPermissions注解不起作用,
-
Spring @Cacheable注解类内部调用失效的解决方案
目录 @Cacheable注解类内部调用失效 @Cacheable注解缓存方法内部调用 方法一 方法二 方法三 方法四 @Cacheable注解类内部调用失效 如果你只是想使用一个轻量级的缓存方案,那么可以尝试使用Spring cache方案. 那么在使用spring @Cacheable注解的时候,要注意,如果类A的方法f()被标注了@Cacheable注解,那么当类A的其他方法,例如:f2(),去直接调用f()的时候,@Cacheable是不起作用的,原因是@Cacheable是基于spri
-
springboot mybatis调用多个数据源引发的错误问题
目录 springboot mybatis调用多个数据源错误 报错 解决方法 springboot-mybatis多数据源及踩坑 springboot项目结构如下 springboot配置文件内容如下 动态数据源的配置类如下 最关键的来了 springboot mybatis调用多个数据源错误 报错 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocation of init meth
-
springboot html调用js无效400问题及解决
目录 springboot html调用js无效400 例如 无法访问css,js,图片等静态资源的三种方案 第一种解决方法 第二种解决方法 第三种解决方法 springboot html调用js无效400 html板在templates下面,js文件在static下面,在模板中引用时不需要加static这个路径. 例如 src └─main ├─java └─resources ├─static │ ├─css │
-
MySQL事务管理的作用详解
目录 1.为何使用事务管理 2.数据库事务的原理 3.什么是事务 3.1 事务的特性ACID 3.2 事务的并发问题 3.3 隔离级别 4.Spring事务管理 1.为何使用事务管理 可以保证数据的完整性.事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内 的所有SQL都将被取消执行. 例子: 转账为例. 金庸向张无忌转账1000元.----在数据库中修改两个账号的余额. 发生意外情况,则出现金庸减钱成功,而张无忌加钱失败. 如何解决?
-
SpringBoot this调用@Bean效果详解
目录 思考的起源 查找信息 更远一步 在一个@Bean方法内,this调用同一个类的@Bean方法会有什么效果呢? 思考的起源 首先上代码: public class BeanOne { } public class BeanTwo { public BeanTwo(BeanOne beanOne){ } } @Configuration public class BeanConfigTest { @Bean @ConditionalOnMissingBean public BeanOne be
随机推荐
- Ueditor百度编辑器的Html模式自动替换样式的解决方法
- js获取上传文件大小示例代码
- 关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
- 正则表达式匹配用户密码
- 谈谈HttpClient使用详解
- 分析Python编程时利用wxPython来支持多线程的方法
- js实现九宫格的随机颜色跳转
- 给WordPress的编辑后台添加提示框的代码实例分享
- sql面试题(查看数据中指定几行记录)
- JavaScript中的方法调用详细介绍
- Java Web程序中利用Spring框架返回JSON格式的日期
- javascript中递归函数用法注意点
- 利用MongoDB中oplog机制实现准实时数据的操作监控
- 关于NoSQL之MongoDB的一些总结
- ORACLE数据库应用开发常见问题及排除
- jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
- jQuery实现遮罩层登录对话框
- 第六章之辅组类与响应式工具
- java开发中嵌套类的详解及实例
- android实现ViewPager懒加载的三种方法