M. Deinumからの回答は良いですが、これを達成する別の方法があります。これは、現在のアプリケーションの状態によっては、より簡単な場合があります。
現在のトランザクションがコミットした後に処理されるイベントで非同期メソッドの呼び出しをラップするだけで、更新されたエンティティを毎回データベースから正しく読み取ることができます。
これを行うのは非常に簡単です。お見せしましょう:
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
@Transactional
public void doSomething() {
// application code here
// this code will still execute async - but only after the
// outer transaction that surrounds this lambda is completed.
executeAfterTransactionCommits(() -> theOtherServiceWithAsyncMethod.doIt());
// more business logic here in the same transaction
}
private void executeAfterTransactionCommits(Runnable task) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
public void afterCommit() {
task.run();
}
});
}
基本的に、ここで行われるのは、現在のトランザクションコールバックの実装を提供し、afterCommitメソッドのみをオーバーライドすることです。他にも役立つ可能性のあるメソッドがあります。それらを確認してください。また、これを他の部分で使用したい場合、または単にメソッドを読みやすくしたい場合は、同じボイラープレートコードを入力しないように、ヘルパーメソッドで抽出しました。