Spring @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 является транзакционным, он все равно должен выполнить откат.

Что я не понимаю, так это то, почему люди говорят, что самопризыв нарушает транзакцию? Пока метод вызывающей стороны является транзакционным, не должно ли все работать так, как ожидалось? Есть что-то, что я здесь скучаю?

Ответы на вопрос(2)

Ваш ответ на вопрос