Spring事务传播行为问题解决
这篇文章主要介绍了Spring事务传播行为问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一、简介
Spring事务配置及相关说明详见:https://www.jb51.net/article/177710.htm。这里说明spring事务的几点注意:
1、默认只会检查回滚RuntimeException的异常。
2、@Transactional注解只能作用于public的方法上,默认传播行为 Propagation.REQUIRED
3、service内部方法之间的调用,不会被spring拦截到,也即不会产生事务
二、坑点
主要的坑点就是在嵌套事务上,当service内部方法之间调用的时候,很可能会产生预期之外的效果。例如下例子:
saveUser保存用户,如果过程出现异常,则执行saveMsg方法。
public class UserServiceImpl implements UserService{ @Autowired private UserDao userDao; @Autowired private MsgDao msgDao; @Autowired private MsgService msgService; @Autowired private UserService userService; @Transactional(propagation = Propagation.REQUIRED) public void saveUser(User user) throws Exception { System.out.println(user.toString()); try { userDao.saveUser(user); int i = 1/0; // saveUser2(user); } catch (Exception e) { // msgService.saveMsg(); // this.saveMsg(); userService.saveMsg(); throw new RuntimeException(); } } @Transactional(propagation = Propagation.REQUIRES_NEW) public void saveMsg() { TbMsg msg = TbMsg.builder().name("xiaocao").msg("xiaoxiao").age(27).build(); msgDao.saveMsg(msg); } }
单元测试,调用saveUser方法,并没有达到想要的效果(saveUser异常,SaveMsg隔离级别是REQUIRES_NEW,理论上应该能入库)。
失败原因即是上面第一节中说的:同一个service中的方法调用,不会产生新事务。Spring 事务的管理控制,主要是通过AOP的动态代理增强来实现的,目标对象本身并没有任何的事务管理能力,都是通过代理对象动态增强功能去实现事务管理。在同一个service中的方法调用,相当于是目标对象本身的this调用,并没有经过代理对象,所以自然的事务配置的嵌套均无效。
解决策略:
1、saveMsg移动到另一个service中,在UserServiceImpl中导入MsgService,saveUser中通过MsgService类去调用。
2、UserServiceImpl中注入自己,通过注入的自身service进行调用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 01-10Springboot中@Value的使用详解
- 01-10springboot实现文件上传步骤解析
- 01-10springboot jta atomikos实现分布式事物管理
- 01-10SpringBoot使用RabbitMQ延时队列(小白必备)
- 01-10如何基于SpringBoot部署外部Tomcat过程解析
- 01-10SPRING BOOT启动命令参数及源码详析
- 01-10springboot集成fastDfs过程代码实例
- 01-10springmvc级联属性处理无法转换异常问题解决
- 01-10SPRINGBOOT读取PROPERTIES配置文件数据过程详解
- 01-10Spring注解和同步锁不能同步问题解决
阅读排行
本栏相关
- 01-10Java实现动态模拟时钟
- 01-10Springboot中@Value的使用详解
- 01-10JavaWeb实现邮件发送功能
- 01-10利用Java实现复制Excel工作表功能
- 01-10Java实现动态数字时钟
- 01-10java基于poi导出excel透视表代码实例
- 01-10java实现液晶数字字体显示当前时间
- 01-10基于Java验证jwt token代码实例
- 01-10Java动态显示当前日期和时间
- 01-10浅谈Java中真的只有值传递么
随机阅读
- 01-10C#中split用法实例总结
- 01-10SublimeText编译C开发环境设置
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 04-02jquery与jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05DEDE织梦data目录下的sessions文件夹有什