春季@Transactional注释:自调用
我知道当一个事务方法从同一类内部调用时,它不会在事务中运行。Spring为事务方法创建一个代理,并将它们包装在一个try-catch块中,并在发生异常时回滚。请考虑以下情形:
@Transactional
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);
}
假设是从另一个对象调用的,并且 中发生了异常,因此成功完成但没有完成。据我所知,即使并且不是事务性的(因为它们是从同一个对象调用的),由于是事务性的,它仍然应该回滚。saveAB
saveB
saveA
saveB
saveA
saveB
saveAB
我不明白的是,为什么人们说自我调用会破坏交易?只要调用方方法是事务性的,难道一切都不应该按预期工作吗?我在这里错过了什么吗?