Câu trả lời từ M. Deinum là tốt nhưng vẫn có một cách khác để đạt được điều này có thể đơn giản hơn cho trường hợp của bạn, tùy thuộc vào trạng thái của ứng dụng hiện tại của bạn.
Bạn có thể chỉ cần gói lệnh gọi đến phương thức không đồng bộ trong một sự kiện sẽ được xử lý sau khi giao dịch hiện tại của bạn cam kết, do đó bạn sẽ đọc thực thể được cập nhật từ db một cách chính xác mọi lúc.
Việc này khá đơn giản, hãy để tôi chỉ cho bạn:
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ề cơ bản những gì xảy ra ở đây là chúng tôi cung cấp triển khai cho lệnh gọi lại giao dịch hiện tại và chúng tôi chỉ ghi đè phương thức afterCommit - có những phương thức khác ở đó có thể hữu ích, hãy kiểm tra chúng. Và để tránh nhập cùng một mã soạn sẵn nếu bạn muốn sử dụng mã này trong các phần khác hoặc đơn giản là làm cho phương thức dễ đọc hơn, tôi đã trích xuất phương thức đó trong một phương thức trợ giúp.