首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate 樂觀鎖實現原理深度剖析與使用注意事項

     編輯:Java 相關知識

Hibernate 支援樂觀鎖與悲觀鎖解決並發髒資料問題。本文專討樂觀鎖。

樂觀鎖運作機制

自動檢測多事務對同一資料操作,依「先贏」原則提交第一筆事務,後續事務提交時拋出 org.hibernate.StaleObjectStateException。

實作步驟

  1. 資料表新增版本控制欄位(如 version),型別限 long, integer, short, timestamp, calendar。
  2. Hibernate 映射檔定義:
    <version name="version" column="VERSION" type="integer"/>
  3. 實體類別加入對應屬性與 getter/setter。

運作範例

Session session1 = sessionFactory.openSession();
Session session2 = sessionFactory.openSession();
MyEntity et1 = session1.load(MyEntity.class, id);
MyEntity et2 = session2.load(MyEntity.class, id);
// et1.version == et2.version (假設 = 1)

Transaction tx1 = session1.beginTransaction();
et1.setName("Entity1");
tx1.commit(); // 版本變為 2
session1.close();

Transaction tx2 = session2.beginTransaction();
et2.setName("Entity2");
tx2.commit(); // 拋出 StaleObjectStateException,因 et2.version=1 < 2
session2.close();

核心原理

事務 1 提交後資料庫 version 遞增。事務 2 提交時 Hibernate 比對實體中的版本號與資料庫當前版本,若較舊則視為過期資料拋出異常。

Web 應用特別注意事項

在 Web 應用中,更新資料時必須確保實體的 version 欄位為更新前的正確值,否則樂觀鎖機制無法正確判斷。常見問題:

  • 表單提交未包含 version 隱藏欄位
  • Session 中實體版本過期
  • DETACHED 狀態實體重新附加時版本未同步

解決:在表單加入 <input type="hidden" name="version" value="${entity.version}"/>,或使用 @Version 註解配合自動版本管理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved