链式事务注释的奇怪行为

时间:2014-07-31 09:18:53

标签: java spring transactions annotations spring-aop

我不知道Spring的事务注释是如何工作的。所以我做了下一个没有实际意义的测试,但是它显示了我的问题:

public class TransactionalTest {
    public void noTransaction(){
        required();
    }

    @Transactional(propagation = Propagation.SUPPORTS)
    public void supports(){
        required();
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void transaction(){
        required();
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void required(){
        mandatory();
    }

    @Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.MANDATORY)
    public void mandatory(){
        doSomething();
    }

    private void doSomething(){
        //I don't feel like to do something.
    }
}

方法noTransactionsupportstransaction调用相同的方法:required但只有最后一个(transaction)正常工作。另外两个人给我回复消息没有找到标记为传播的交易的现有交易'强制性

在实际情况中,我有一些非事务性方法,它们调用用REQUIRED注释的事务方法(它工作正常)。但是如果非事务性方法调用一个事务方法(用REQUIRED注释),它调用另一个用MANDATORY注释的事务方法,则它会失败。

为什么这种行为又如何避免呢?为了以防万一,我注释了所有调用transaccional方法的方法?

1 个答案:

答案 0 :(得分:1)

如果您正在使用默认的AOP方法Spring Proxy AOP,则通过使用拦截和建议调用的代理对象包装带注释的类来实现建议。当您使用这样的自我调用时,您将绕过代理,并且不会应用建议。

如果你确实需要在自我调用上使用建议,你需要使用AspectJ AOP,它实际上修改了有问题的类而不是装饰它。