首页 > 解决方案 > 我应该为读取语句使用哪个事务隔离级别?

问题描述

我需要在新插入的行中插入一条新记录,使用 city_id 列的 MAX 值加一。因此,如果 MAX 值为 14,则下一个插入行的 city_id 列值应为 15。

在我的代码中,我将获取 city_id 列的最大值,将其递增,然后将其保存。我正在为该代码使用弹簧事务。

  private void saveCityDetail(final CityBO googleCityBO) {
    if (googleCityBO.getId() == null) {
      final Long cityId = cityMasterRepository.findMaxCityId();
      googleCityBO.setCityId(cityId + 1);
      googleCityBO.setActive(true);
    }
    cityMasterRepository.save(cityEntityBOMapper.convertCityBOToCityEntity(googleCityBO));
  }

我想知道应该使用隔离级别,以便事务可以读取最大计数并获取读取锁,以便其他事务应该等待该事务完成。

标签: javamysqlhibernatejpatransactions

解决方案


SERIALIZABLE是唯一保证“其他事务应等待此事务完成”的保证。

如果事务中采取的唯一动作是读取一行并更新同一行,则不会发生死锁,并且不需要正常的重试循环。


推荐阅读