代码之家  ›  专栏  ›  技术社区  ›  Suren Aznauryan

Hibernate如何在提交事务之前检查行版本是否存在乐观锁定

  •  0
  • Suren Aznauryan  · 技术社区  · 6 年前

    select

    假设在发布之后 选择 语句hibernate发现行版本没有更改,因此应该继续提交事务。

    我想知道hibernate如何确保在选择行和提交当前事务之间的时间段内,没有任何其他事务会更新行并更改其版本号?hibernate可以做的唯一可能的事情似乎是使用悲观锁选择行版本 Select ... For Update

    如果我想的是真的:

    • 然后,hibernate乐观锁实际上使用悲观锁进行操作,尽管悲观锁保持的时间很短,因为事务将在这之后立即提交。

    请分享你的想法。

    1 回复  |  直到 6 年前
        1
  •  8
  •   Vlad Mihalcea    4 年前

    对于默认的乐观锁定机制 @Version

    1. 从数据库中获取实体及其版本:

       SELECT * FROM PRODUCT WHERE ID = 1;
      
    2. 更新或删除将使用与获取实体相同的SELECT获取的版本:

       UPDATE PRODUCT SET (LIKES, QUANTITY, VERSION) = (5, 10, 3) 
       WHERE ID = 1 AND VERSION = 2;
      

    休眠只检查 updateCount 试验结果 PreparedStatement.executeUpdate 更新计数 ,这意味着行已被删除或版本已更改,这意味着我们使用的是过时数据,因此 OptimisticLockException

    因此,默认值不会发生冲突 @Version 基于乐观锁定,因为一次只能由单个事务修改一条记录,并且一旦行被修改锁定,锁将一直保持到事务提交或回滚。

    LockModeType.OPTIMISTIC 会导致比赛状态。但是,你可以很容易地 fix that using a pessimistic shared or explicit lock .

    推荐文章