天天看点

事务 @Transactional 的 Propagation.REQUIRES_NEW

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catoop/article/details/53482960

小经验:

同一个业务类里面 , 即使声明为 Propagation.REQUIRES_NEW也不会新启一个事务。必须调用另一个类的Propagation.REQUIRES_NEW方法才行。

如下代码:

@Service
public class A {

    @Autowired
    private OrderApplyMapper orderApplyMapper;

    @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = Exception.class)
    public int testB(OrderApply order) {
        return orderApplyMapper.save(order);
    }

    @Transactional
    public void testA(OrderApply order) {
        System.out.println("1111111111111");
        testB(order);
        System.out.println("2222222222222");
        throw new RuntimeException();
    }

}
           

这2个方法在同一个类中,本身预期结果是testB方法执行成功,testA方法回滚。实际结果是testB也会被回滚。

如果想使 Propagation.REQUIRES_NEW 生效,则需要把testB这个方法单独放到别的类中,然后调用过来。

具体为什么会这样,没有深究,写下来记录一下。

继续阅读