我的應用程序加載應該處理的實體列表。這發生在使用REQUIRES_NEW
爲傳播層面使用調度我應該將管理實體傳遞給需要新事務的方法嗎?
@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);
}
}
在我HandlingService
處理每個任務issolation類。
@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);
}
}
}
代碼工作只是因爲我在TaskScheduler
類啓動父事務。如果我刪除@Transactional
註釋,則不再管理這些實體,並且任務實體的更新不會傳播到db。我不覺得自然而然地使該預定方法成爲事務性的。
從我看到我有兩個選擇:今天
1.保持代碼,因爲它是。
- 也許這只是我,這是一個正確的方法。
- 此變體對數據庫的訪問次數最少。
2.從計劃中刪除@Transactional
註解,通過任務的ID,並重新加載在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);
}
}
}
- 擁有更多的去使用
@Async
能否請您提供您的意見上這是正確的道路數據庫(一個額外的查詢/元)
在此示例中,嵌套事務的會話實體緩存是否與外部事務的會話同步?例如,如果「任務」實體在嵌套事務內部發生更改,那麼該更改是否也適用於出事務會話? – froi
跟着我的問題,因爲外部事務的會話被刷新,這是否意味着任務更改將被視爲「陳舊」更改? – froi