我的Java应用程序中有两种不同的方法,每种方法都在同一张表upload_table
上执行某些任务。请在下面找到通过两种不同方法执行的任务。
@Override
@Transactional(isolation = Isolation.SERIALIZABLE)
public void createClaimsFromNewUploadAndMarkUploadAsPending(Long uploadId) {
try {
ExcelClaimUpload claimUpload = excelClaimUploadRepository.findOne(uploadId); // it will fetch records from upload_table
if (claimUpload == null || !claimUpload.isNewUpload()) return;
createPendingProcessingClaimsFrom(claimUpload);
claimUpload.setStatus(PENDING);
}catch(Exception e) {
e.printStackTrace();
}
}
上述任务将从同一张表upload_table
中获取详细信息。
@Override
@Transactional
public ExcelClaimUpload createNewClaimUpload(ExcelClaimUpload claimUpload) {
claimUpload.setStatus(NEW);
List<UploadLineItem> uploadLineItems = claimUpload.getUploadLineItems();
if(claimUpload.getUploadLineItems() != null && claimUpload.getUploadLineItems().size()==0) {
claimUpLoad.setRowErrors(true);
}
uploadLineItemService.save(uploadLineItems); // it will save the records in upload_table
claimUpLoad = excelClaimUploadRepository.save(claimUpload);
}
return claimUpLoad;
}
上述任务会将记录保存到同一表upload_table
中。
但是上述方法将由两个不同的线程(进程)触发。
在通过玉米作业执行这些任务时,有时会出现以下异常。
optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
如何避免这种例外情况?
我尝试过使用@Transactional(isolation = Isolation.SERIALIZABLE)
,它将从表upload_table
中获取记录,但是没有运气。