【问题标题】:Which Transaction isolation level should i use for read statement?我应该为读取语句使用哪个事务隔离级别?
【发布时间】:2023-04-05 15:15:01
【问题描述】:

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

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

  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));
  }

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

【问题讨论】:

    标签: java mysql hibernate jpa transactions


    【解决方案1】:

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

    如果事务中唯一的动作是读取一行,更新同一行,那么就不会发生死锁,也就不需要正常的重试循环了。

    【讨论】:

    • 谢谢,安德烈亚斯。但是我在事务中得到了 max(City_id),然后插入了一个 max+1 的新行。我只想知道另一个事务在提交该事务之前甚至没有从表中读取 max(city_id) (读锁是否仍然存在)的可序列化保证。
    • 没有隔离级别可以防止多个事务读取同一条记录。如果是这样,性能将是可怕的。
    • 好的,谢谢@Andreas。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多