我不明白的是,为什么人们说自我调用会破坏交易?
我从未听说过自调用会中断事务。我所知道的是,自调用不会启动新事务,您已经提到了原因。
在代理模式(默认设置)下,仅拦截通过代理传入的外部方法调用。这意味着,实际上,即使被调用的方法标有@Transactional,自调用实际上也不会导致运行时实际事务在目标对象中调用目标对象的另一种方法。
如果@Transaction
从中删除注释saveAB()
,则将观察该方法saveA()
,saveB()
即使使用注释,也不会在事务下运行@Transactional
。但是,如果您在类外部调用saveA()
或saveB()
从类外部调用,它将按预期在事务下运行。这就是为什么人们建议对自调用要谨慎的原因。
public void saveAB(A a, B b)
{
saveA(a);
saveB(b);
}
@Transactional
public void saveA(A a)
{
dao.saveA(a);
}
@Transactional
public void saveB(B b)
{
dao.saveB(b);
}