@Transactional 注解失效实验

这里主要实验同一个Service 中调用不同的方法出现的失效,比如 Service 中 A() 方法中调用 B() 。

实验如下:

场景1:

@Service
public class TestTransactionService {
	
    @Autowired
    private SignTaskRepository signTaskRepository;

    @Transactional
    public void methodA() {
        doSomethingBefore(); 
        this.methodB();
        doSomethingAfter();
    }

    //@Transactional
    public void methodB() {
        SignTask task = new SignTask();
        task.setSalesNo("testNo");
        signTaskRepository.save(task);
        throw new RuntimeException("testError");
    }
}

mothodA()有 @Transactional 注解, mothodB() 没有@Transactional 注解,这时候数据会不会插入到数据库中呢?结果是不会,说明mothodA() 的事务起作用。

因为methodA()开启了一个事务,methodB()加入到这个事务中,异常回滚,这个没什么问题。

场景2:

@Service
public class TestTransactionService {
	
    @Autowired
    private SignTaskRepository signTaskRepository;

    //@Transactional
    public void methodA() {
        doSomethingBefore(); 
        this.methodB();
        doSomethingAfter();
    }

    @Transactional
    public void methodB() {
        SignTask task = new SignTask();
        task.setSalesNo("testNo");
        signTaskRepository.save(task);
        throw new RuntimeException("testError");
    }
}

mothodA()有 没有 Transactional 注解, mothodB() 有@Transactional 注解,这时候数据会不会插入到数据库中呢?结果是会,说明mothodB() 的事务不起作用。这是因为 methodA() 中 调用 methodB()  是用 this.methodB() 调用的。

场景3:

@Service
public class TestTransactionService {
	
    @Autowired
    private SignTaskRepository signTaskRepository;

    //@Transactional
    public void methodA() {
        doSomethingBefore();
        TestTransactionService bean = BaseHolder.getBean(TestTransactionService.class);
        bean.methodB(); 
        //this.methodB();
        doSomethingAfter();
    }

    @Transactional
    public void methodB() {
        SignTask task = new SignTask();
        task.setSalesNo("testNo");
        signTaskRepository.save(task);
        throw new RuntimeException("testError");
    }
}

mothodA()有 没有 Transactional 注解, mothodB() 有@Transactional 注解,但是这是调用 methodB() 的方式是BaseHolder.getBean(),内部实际上是使用 spring 的ApplicationContext.getBean()。 这时候数据会不会插入到数据库中呢?

结果是不会,说明  mothodB() 的事务起作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值