【问题标题】:Strange behaviour for chainned transactional annotation链式事务注释的奇怪行为
【发布时间】:2014-09-23 04:17:16
【问题描述】:

我不明白 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) 可以正常工作。另外两个给我返回消息No existing transaction found for transaction 标记为传播“强制”

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

为什么会出现这种行为以及如何避免这种行为?我注释了所有调用transaccional方法的方法以防万一?

【问题讨论】:

    标签: java spring transactions annotations spring-aop


    【解决方案1】:

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

    如果您确实需要在自调用上应用建议,则需要使用 AspectJ AOP,它实际上修改了相关类而不是装饰它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 2011-02-24
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多