次の実装があります。
_@Transactional
public void saveAndGenerateResult(Data data) {
saveDataInTableA(data.someAmountForA);
saveDataInTableB(data.someAmountForB);
callAnAggregatedFunction(data);
}
public void saveDataInTableA(DataA a) {
tableARepository.saveAndFlush(a);
}
public void saveDataInTableA(DataB b) {
tableBRepository.saveAndFlush(b);
}
public void callAnAggregatedFunction() {
// Do something based on the data saved from the beginning in Table A and Table B
}
_
saveAndFlush
を使用してデータをcallAnAggregatedFunction
関数ですぐに利用できるようにし、集計結果を取得して別のテーブルに保存することが重要です。そのため、トランザクションをすぐにデータベースにフラッシュしないsave
関数を使用していません。
ただし、_@Transactional
_アノテーションを関数saveAndGenerateResult
で使用しています。これは、通常、_@Transactional
_メソッドに対するアノテーション。
この特定の場合のシナリオは何ですか?私はsaveAndFlush
を使用しています。これはデータベーステーブルにデータをすぐにフラッシュし、最後の関数(つまりcallAnAggregatedFunction
)がデータをテーブルに書き込めなかった場合、テーブルAとテーブルBはロールバックされますか?
テーブルAとテーブルBの以前の書き込み操作はロールバックされますか?
はい。ただし、saveAndFlush()
メソッドに独自のトランザクションがない場合(つまり、_propagation = REQUIRES_NEW
_を使用する場合)。
それらがすべてsaveAndGenerateResult()
で開始したトランザクションの一部である場合、データベースに加えられたすべての変更は失敗した場合にロールバックされます。