Ứng dụng của tôi tải danh sách các thực thể cần được xử lý. Điều này xảy ra trong một lớp học có sử dụng một lịch trìnhTôi có nên chuyển pháp nhân được quản lý sang phương thức yêu cầu giao dịch mới không?
@Component
class TaskScheduler {
@Autowired
private TaskRepository taskRepository;
@Autowired
private HandlingService handlingService;
@Scheduled(fixedRate = 15000)
@Transactional
public void triggerTransactionStatusChangeHandling() {
taskRepository.findByStatus(Status.OPEN).stream()
.forEach(handlingService::handle);
}
}
Trong HandlingService
quá trình tôi từng nhiệm vụ trong issolation sử dụng REQUIRES_NEW
cho mức độ tuyên truyền.
@Component
class HandlingService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void handle(Task task) {
try {
processTask(task); // here the actual processing would take place
task.setStatus(Status.PROCCESED);
} catch (RuntimeException e) {
task.setStatus(Status.ERROR);
}
}
}
Mã chỉ hoạt động vì tôi đã bắt đầu giao dịch gốc trên TaskScheduler
lớp. Nếu tôi xóa chú thích @Transactional
thì các thực thể sẽ không được quản lý nữa và bản cập nhật cho thực thể nhiệm vụ không được truyền sang db.I không thấy tự nhiên khi thực hiện giao dịch phương thức được lên lịch.
Từ những gì tôi thấy tôi có hai lựa chọn:
1. đang Giữ như ngày nay.
- Có thể đó chỉ là tôi và đây là một sản phẩm chính xác.
- Biến thể này có ít chuyến đi nhất đến cơ sở dữ liệu.
2. Xóa chú thích @Transactional
khỏi Trình lập lịch biểu, chuyển id của tác vụ và tải lại thực thể nhiệm vụ trong HandlingService.
@Component
class HandlingService {
@Autowired
private TaskRepository taskRepository;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void handle(Long taskId) {
Task task = taskRepository.findOne(taskId);
try {
processTask(task); // here the actual processing would take place
task.setStatus(Status.PROCCESED);
} catch (RuntimeException e) {
task.setStatus(Status.ERROR);
}
}
}
- Có nhiều chuyến đi đến cơ sở dữ liệu (thêm một truy vấn/phần tử)
- có thể được thực hiện bằng
@Async
bạn có thể vui lòng cung cấp ý kiến của bạn trên đó là cách chính xác giải quyết vấn đề này, có thể với một phương pháp khác mà tôi không biết?
Trong ví dụ này, bộ nhớ cache của thực thể phiên giao dịch lồng nhau sẽ được đồng bộ hóa với phiên giao dịch bên ngoài không? Ví dụ: nếu thực thể "Tác vụ" được thay đổi bên trong giao dịch lồng nhau, liệu thay đổi đó có áp dụng cho phiên giao dịch ngoài không? – froi
Theo dõi câu hỏi của tôi, khi phiên giao dịch bên ngoài bị xóa, điều đó có nghĩa là các thay đổi Nhiệm vụ sẽ được tính là thay đổi "cũ"? – froi