事务因Propagation.REQUIRES_NEW导致的bug分析

开发时候,遇到一个奇葩问题,单独部署(3情况)不会出现bug,而合并打包(4情况)时候,反而出现异常
先说明下,方法A、B、C、D方法不在一个类内,否则会导致AOP失效

	@Transactional
	public void A() {

	}

	@Transactional
	public void B() {

	}

	@Transactional
	public void C() {
    	A();
   	 	B();
	}

1)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
可以的,因为AB在C方法中,是在一个事务内

    @Transactional
    public void A() {

    }

    @Transactional
    public void B() {

    }

    public void C() {
        A();
        B();
    }

2)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
可以的,虽然A、B不在一个事务内,但是调用B方法是,A方法的事务已经提交

    @Transactional
    public void A() {

    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void B() {

    }

    public void C() {
        A();
        B();
    }

3)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
可以的,本质和2)一样

    @Transactional
    public void A() {

    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void B() {

    }
	
    @Transactional
    public void C() {
        A();
        B();
    }

4)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
不可以,C和A是一个事务,B事务单独,因为C在调B方法时,C事务并没有提交,所以B方法内查不到A方法内保存的数据

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void A() {

    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void B() {

    }
	
    @Transactional
    public void C() {
        A();
        B();
    }

5)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
可以的,因为A和B都是单独的

具体该不该加事务,该加怎样的事务,都要具体问题具体考虑,不能因为需要实现一个功能,导致其他的bug


版权声明:本文为qq_33321609原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。