spring—多个使用者试图更新mysql(5.7版本)表的同一行如何修复并发更新问题

rdrgkggo  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(373)

多个使用者正在尝试更新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;
    }
}
sczxawaw

sczxawaw1#

使用@transactional注解,我们可以设置spring管理的事务方法的隔离级别。这意味着此方法中执行的事务将具有该隔离级别。在你的情况下,你所要做的就是以下几点。

@Transactional(isolation=Isolation.READ_COMMITTED)

现在,如果要为整个数据库设置隔离级别,您可以执行以下操作。

<property name="hibernate.connection.isolation">2</property>

相关问题