2017-07-25 94 views
1

我正在嘗試JPA支持數據庫鎖定以避免記錄中的併發請求。在我的情況下,我需要使用pesssimistic鎖。我得到了使用以下方法:如何用JPA獲得PessimisticLockException

EntityManager em; 
... 

Map<String,Object> props = new HashMap<String,Object>(); 
props.put("javax.persistence.lock.timeout", 0); 
em.find(MyEntity.class, id, LockModeType.PESSIMISTIC_READ, props) 

,但這種做法我處理LockTimeoutException而不是PessimisticLockException如何處理PessimisticLockException特別是

回答

1

根據此規範,PessimisticLockException只發生在事務級回滾:

如果不能獲得鎖,和數據庫鎖定故障 導致事務級回滾,提供者必須拋出 PessimisticLockException並確保已將JTA事務或 EntityTransaction標記爲回滾。

您的事務似乎只包含該單一數據檢索查詢,並且持續性提供程序認爲如果該查詢發生鎖定錯誤,則回滾將被視爲語句級別回滾。其中根據規範將導致LockTimeoutException

如果不能獲得鎖,和數據庫鎖定故障 僅導致語句級回滾,提供者必須拋出 LockTimeoutException(且不得標註回滾事務)。

我認爲這是一個驅動程序/持久性提供程序的聰明方式,讓您有機會重複/修復您的語句,而不是隱式地回滾整個事務。一般來說,我認爲如果你在查找之前有一個插入或者更新(或者一些更復雜的數據操作語句),那麼你會得到PessimisticLockException