トランザクションメソッドが同じクラス内から呼び出された場合、トランザクションで実行されないことを私は知っています。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
私が理解できないのは、自己呼び出しがトランザクションを壊すと人々が言うのはなぜですか? 呼び出し元のメソッドがトランザクションである限り、すべてが期待どおりに機能するはずではありませんか? ここに欠けているものはありますか?