La réponse de M. Deinum est bonne mais il existe encore un autre moyen d'y parvenir qui peut être plus simple pour votre cas, selon l'état de votre application actuelle.
Vous pouvez simplement encapsuler l'appel à la méthode async dans un événement qui sera traité après la validation de votre transaction actuelle afin que vous puissiez lire correctement l'entité mise à jour à partir de la base de données à chaque fois.
C'est assez simple à faire, laissez-moi vous montrer :
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();
}
});
}
Fondamentalement, ce qui se passe ici, c'est que nous fournissons une implémentation pour le rappel de transaction en cours et que nous remplaçons uniquement la méthode afterCommit - il existe d'autres méthodes qui pourraient être utiles, vérifiez-les. Et pour éviter de taper le même code passe-partout si vous souhaitez l'utiliser dans d'autres parties ou simplement rendre la méthode plus lisible, j'ai extrait cela dans une méthode d'assistance.