Odpověď od M. Deinum je dobrá, ale stále existuje jiný způsob, jak toho dosáhnout, který může být pro vás jednodušší, v závislosti na stavu vaší aktuální aplikace.
Volání asynchronní metody můžete jednoduše zabalit do události, která bude zpracována po potvrzení vaší aktuální transakce, takže aktualizovanou entitu z db pokaždé přečtete správně.
Je to docela jednoduché, dovolte mi, abych vám ukázal:
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();
}
});
}
V zásadě se zde stane to, že dodáme implementaci pro aktuální zpětné volání transakce a přepíšeme pouze metodu afterCommit – existují další metody, které by mohly být užitečné, podívejte se na ně. A abyste se vyhnuli psaní stejného standardního kódu, pokud jej chcete použít v jiných částech nebo jednoduše učinit metodu čitelnější, extrahoval jsem to v pomocné metodě.