鎖定是處理資料庫事務並發的關鍵技術。JPA 1.0 僅支援樂觀鎖(READ/WRITE),JPA 2.0 引入 6 種新模式,包含 2 種樂觀、3 種悲觀與 1 種無鎖模式。
OPTIMISTIC:等同 READ,新應用建議使用OPTIMISTIC_FORCE_INCREMENT:等同 WRITE,新應用建議使用PESSIMISTIC_READ:讀取即鎖定,確保重複讀期間資料不被修改,不阻擋其他事務讀取PESSIMISTIC_WRITE:更新時鎖定,強制並發更新序列化,適合更新失敗率高場景PESSIMISTIC_FORCE_INCREMENT:讀取時鎖定,事務結束時強制遞增版本屬性,即使資料未修改另提供 NONE 表示無鎖。
可透過 EntityManager.lock()、find()、refresh() 指定鎖模式。範例:
Part p = em.find(Part.class, pId);
em.refresh(p, PESSIMISTIC_WRITE);
int pAmount = p.getAmount();
p.setAmount(pAmount - uCount);
先讀取資料,再套用 PESSIMISTIC_WRITE 鎖定並刷新,更新期間阻擋其他事務修改同一實體。
JPA 2.0 還整合 Bean Validation,可在 persistence.xml 以 <validation-mode> 設定自動驗證週期,持久化/更新/移除時自動檢查實體約束(如欄位最大長度)。