簡體   English   中英

如何使用 JPA 鎖定數據庫行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM