Spring事务传播行为问题解决

网友投稿 464 2023-07-02

Spring事务传播行为问题解决

Spring事务传播行为问题解决

这篇文章主要介绍了Spring事务传播行为问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、简介

Spring事务配置及相关说明详见:https://jb51-/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方法,并没有达到想要的效ffoMeRtAx果(saveUser异常,SaveMsg隔离级别是REQUIRES_NEW,理论上应该能入库)。

失败原因即是上面第一节中说的:同一个service中的方法调用,不会产生新事务。Spring 事务的管理控制,主要是通过AOP的动态代理增强来实现的,目标对象本身并没有任何的事务管理能力,都是通过代理对象动态增强功能去实现事务管理。在同一个service中的方法调用,相当于是目标对象本身的this调用,并没有经过代理对象,所以自然的事务配置的嵌套均无效。

解决策略:

1、saveMsg移动到另一个service中,在UserServiceImpl中导入MsgService,saveUser中通过MsgService类去调用。

2、UserServiceImpl中注入自己,通过注入的自身service进行调用。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JDK13.0.1安装与环境变量的配置教程图文详解(Win10平台为例)
下一篇:springboot+idea热启动设置方法(自动加载)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~