繁体   English   中英

休眠。 乐观的锁定。 即使生成它也会选择版本

[英]Hibernate. Optimistic lock. Selects version even though it generates it

我有一个实体:

<class name="name.dargiri.model.Entity" table="ENTITY" optimistic-lock="version">
  <version name="version" column="ver" type="long" />
</class

如果实体被保存无论多少次,在事务结束时 Hibernate会选择该对象的版本。 为什么? Hibernate在存储对象时生成此版本,因此它知道它。 我发现这个方法调用了这个:

EntityVerifyVersionProcess#getCurrentVersion()

Hibernate在日志中生成:

Hibernate: 
    /* update
        name.dargiri.model.Entity */ update
            ENTITY 
        set
            ver=?,
            USERNAME=?,
            lucky_number=? 
        where
            id=? 
            and ver=?
Hibernate: 
    /* get version name.dargiri.model.Entity */ select
        ver 
    from
        ENTITY 
    where
        id =?

我使用MySQL和Session#save()。

由于版本号由数据库管理,因此Hibernate执行额外的SQL语句以在更新后检索版本号。 有关详细信息,我建议您查看一下这篇解释得非常好的文章

好吧,所以我没有写过以及似乎是什么问题是使用LockMode.OPTIMISTIC: session.get(Entity.class, 1L, LockMode.OPTIMISTIC);

似乎这是锁定模式的工作方式 - 它在事务结束时检查到目前为止是否没有人更改对象的版本。 这种情况不会在刷新时发生,因为Hibernate无论如何都会进行检查,但是在交易结束时,我认为,在覆盖数据时需要更加谨慎。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM