簡體   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