Несколько потребителей пытаются обновить поля «ОбработанныеРекордс» и «ЭрредРекордс» в JobTracker.Но я столкнулся с проблемой, когда случайные значения обновляются в этих столбцах.Mysql находится на уровне изоляции по умолчанию (MySQL версии 5.7)
Я думал о блокировке строки с помощью PESSIMISTIC_WRITE.Но следующий код не дает никаких исключений, а также значения строк не обновляются.Кто-то, пожалуйста, помогите мне в решении этой проблемы.
Обратите внимание: 1. Любое решение, которое изменяет уровень изоляции для всей БД, бесполезно, так как это повлияет на другие потоки в приложении.2. Оба параметра «processRecords» и «erredRecords» имеют тип Long.
@Override
@Transactional
public Boolean updateRecords(Long jobTrackerId, Long processedRecords, Long erredRecords) {
try{
JobTracker jobTracker = getEntityManager(true).find(JobTracker.class, jobTrackerId);
getEntityManager(true).lock(jobTracker, LockModeType.PESSIMISTIC_WRITE);
if(jobTracker == null){
return false;
}
if(processedRecords!=null){
jobTracker.setProcessedRecords(processedRecords);
}
if(erredRecords!=null){
jobTracker.setErredRecords(erredRecords);
}
if(jobTracker.getErredRecords() != null && jobTracker.getProcessedRecords() != null && jobTracker.getTotalRecords() != null){
if(jobTracker.getErredRecords() + jobTracker.getProcessedRecords() == jobTracker.getTotalRecords()){
jobTracker.setStatus("Completed");
}else if(jobTracker.getErredRecords() + jobTracker.getProcessedRecords() > jobTracker.getTotalRecords()){
jobTracker.setStatus("Erred");
}
}
getEntityManager(true).merge(jobTracker);
return true;
}catch(PersistenceException e){
logger.error("For job id:" + jobTrackerId + " Exception while updating the jobTracker records data", e);
return false;
}catch (Exception e){
logger.error("For job id:" + jobTrackerId + "Generic Exception while updating the jobTracker records data",e);
return false;
}
}