web-dev-qa-db-ja.com

@TransactionalアノテーションはsaveAndFlushで機能しますか?

次の実装があります。

_@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はロールバックされますか?

8
Reaz Murshed

テーブルAとテーブルBの以前の書き込み操作はロールバックされますか?

はい。ただし、saveAndFlush()メソッドに独自のトランザクションがない場合(つまり、_propagation = REQUIRES_NEW_を使用する場合)。

それらがすべてsaveAndGenerateResult()で開始したトランザクションの一部である場合、データベースに加えられたすべての変更は失敗した場合にロールバックされます。

詳細: Spring-@Transactional-バックグラウンドで何が起こりますか?

Spring @Transactional-分離、伝播

14
Kayaman