Svaret fra M. Deinum er godt, men der er stadig en anden måde at opnå dette på, som kan være enklere for dig, afhængigt af status for din aktuelle ansøgning.
Du kan ganske enkelt ombryde opkaldet til async-metoden i en hændelse, der vil blive behandlet, efter din nuværende transaktion er forpligtet, så du vil læse den opdaterede enhed fra databasen korrekt hver gang.
Er ret simpelt at gøre dette, lad mig vise dig:
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();
}
});
}
Grundlæggende er det, der sker her, at vi leverer en implementering til den aktuelle transaktions tilbagekaldelse, og vi tilsidesætter kun afterCommit-metoden - der er andre metoder der, der kan være nyttige, tjek dem ud. Og for at undgå at skrive den samme boilerplate-kode, hvis du vil bruge denne i andre dele eller blot gøre metoden mere læsbar, har jeg udtrukket den i en hjælpermetode.