同一个service中方法内部调用的事务

网上看了很多关于说,同一个service中方法内部调用事务失效问题

刚好最近的代码涉及到了这一个,就做了一下测试,可是却发现好像,没有什么问题!

@Override
@Transactional
public Result<?> deleteById(String id) { 
    testMapper.deleteById(id);
    updateStatus(id);
    return Result.ok("删除成功");
}
@Transactional
public void updateStatus(String ddCode) {
    testMapper.updateStatus(ddCode, DDStatusEnum.finish.code);
    if(1==1){
        throw new RuntimeException("测试异常,回滚");
    }
}

虽然我觉得网上的其他人说的都很有道理,但是却发现当发生异常时deleteById回滚了,updateStatus方法也发生了回滚,这不由得让我感觉很奇怪,

记录一下,等我抽时间找找原因

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
事务方法内部调用方法默认会参与到当前事务,并且如果内部方法抛出异常,整个事务会回滚。但是,如果你希望某些内部方法不参与当前事务并且不会导致事务回滚,可以使用Propagation.REQUIRES_NEW属性来实现。 具体实现如下: 1. 在外层事务方法上添加@Transactional注解,指定事务属性为默认值,比如:@Transactional。 2. 在需要独立事务内部方法上,添加@Transactional注解,并将Propagation属性设置为Propagation.REQUIRES_NEW。 3. 当内部方法调用时,会启动一个独立的事务,并将当前事务挂起。即使内部方法抛出异常,独立事务也会提交,不回滚外层事务。 示例代码如下: ```java @Service public class MyService { @Autowired private MyDao myDao; @Transactional public void doSomething() { // 外层事务方法 myDao.update(); doSomethingElse(); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void doSomethingElse() { // 内部独立事务方法 myDao.insert(); } } ``` 在上面的示例,外层doSomething方法内部doSomethingElse方法都使用了@Transactional注解,但是内部方法添加了Propagation属性为Propagation.REQUIRES_NEW,表示需要独立事务。当doSomething方法调用时,myDao.update()会参与当前事务,然后调用doSomethingElse方法时,会启动一个新的事务,myDao.insert()会参与这个新事务,即使doSomethingElse方法抛出异常,独立事务也会提交,不会回滚外层事务
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值