我不知道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.
}
}
方法noTransaction
,supports
和transaction
调用相同的方法:required
但只有最后一个(transaction
)正常工作。另外两个人给我回复消息没有找到标记为传播的交易的现有交易'强制性 。
在实际情况中,我有一些非事务性方法,它们调用用REQUIRED
注释的事务方法(它工作正常)。但是如果非事务性方法调用一个事务方法(用REQUIRED
注释),它调用另一个用MANDATORY
注释的事务方法,则它会失败。
为什么这种行为又如何避免呢?为了以防万一,我注释了所有调用transaccional方法的方法?
答案 0 :(得分:1)
如果您正在使用默认的AOP方法Spring Proxy AOP,则通过使用拦截和建议调用的代理对象包装带注释的类来实现建议。当您使用这样的自我调用时,您将绕过代理,并且不会应用建议。
如果你确实需要在自我调用上使用建议,你需要使用AspectJ AOP,它实际上修改了有问题的类而不是装饰它。