Odpowiedź od M. Deinum jest dobra, ale jest jeszcze inny sposób na osiągnięcie tego, który może być dla Ciebie prostszy, w zależności od stanu Twojej aktualnej aplikacji.
Możesz po prostu zawinąć wywołanie metody asynchronicznej w zdarzeniu, które zostanie przetworzone po zatwierdzeniu bieżącej transakcji, aby za każdym razem poprawnie odczytywać zaktualizowaną jednostkę z bazy danych.
Jest to dość proste, pokażę ci:
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();
}
});
}
Zasadniczo dzieje się tutaj, że dostarczamy implementację dla wywołania zwrotnego bieżącej transakcji i zastępujemy tylko metodę afterCommit - są tam inne metody, które mogą być przydatne, sprawdź je. Aby uniknąć wpisywania tego samego standardowego kodu, jeśli chcesz użyć tego w innych częściach lub po prostu uczynić metodę bardziej czytelną, wyodrębniłem go w metodzie pomocniczej.