Отговорът от M. Deinum е добър, но има още един начин да постигнете това, който може да е по-прост за вашия случай, в зависимост от състоянието на текущото ви приложение.
Можете просто да обвиете извикването към метода async в събитие, което ще бъде обработено след извършване на текущата транзакция, така че всеки път да четете правилно актуализирания обект от db.
Това е доста лесно, позволете ми да ви покажа:
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 - там има други методи, които може да са полезни, проверете ги. И за да избегнете въвеждането на същия стандартен код, ако искате да използвате това в други части или просто да направите метода по-четлив, извадих го в помощен метод.