[英]How to lock a database row with JPA
在以下代碼片段中,整個表而不是單個行被鎖定:
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void myInsertMethod(MyEntity myEntity) {
/*1 this doesn't works*/
manager.lock(myEntity,LockModeType.READ);
manager.persist(myEntity);
/* and this works but I dont know is it what i want or not...*/
manager.persist(myEntity);
manager.lock(myEntity,LockModeType.READ);
}
我認為正確的代碼如下,但它不起作用
/*lock entire table for select*/
manager.lock(MyEntity.class.LockModeType.READ);
/* and after locking table persist code */
manager.persist(myEntity);
請告訴我如何完成這項工作,並為我推薦一篇學習該問題的好文章。
LockModeType.READ 等於 OPTIMISTIC ,這意味着 Hibernate 嘗試在事務完成之前驗證樂觀鎖定的實體版本。
除了可能的 race condition ,這對你沒有太大幫助。 在您的情況下,實體在刷新操作發出 INSERT statement時獲取隱式鎖。
因為實體有唯一的 PRIMARY KEYS,你甚至不應該太在意鎖定行,因為你不能有兩個事務插入同一行。 並發控制更適合 UPDATE/DELETE 語句,即使這樣,您也不需要鎖定整個表(只需鎖定要更改的記錄)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.