多个使用者正在尝试更新jobtracker的“processedrecords”和“erredrecords”字段。但我面临的问题是,这些列中的随机值会更新。mysql处于默认隔离级别(mysql版本5.7)
我想用悲观的方法来锁定行。但下面的代码不会给出任何异常,而且行值也不会更新。请有人帮我解决这个问题。
请注意:1。任何改变整个数据库隔离级别的解决方案都没有帮助,因为它会影响应用程序中的其他流。2“processedrecords”和“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;
}
}
1条答案
按热度按时间sczxawaw1#
使用@transactional注解,我们可以设置spring管理的事务方法的隔离级别。这意味着此方法中执行的事务将具有该隔离级别。在你的情况下,你所要做的就是以下几点。
现在,如果要为整个数据库设置隔离级别,您可以执行以下操作。