2012-04-18 52 views
6

我想了解什麼是調用EntityManager.lock(實體,LockModeType.READ)的效果。 API文檔聽起來讓我感到非常困惑。JPA:Read Lock如何工作?

如果我必須併發線程和線程1調用鎖(實體,LockModeType.READ),線程2仍然可以讀寫實體嗎?

我已經學會爲止:

在JPA1讀鎖定類型是相同JPA2樂觀。如果設置了這樣的鎖,則EntityManager在提交事務之前檢查版本屬性,但不更新它。我找到了OPTIMISTIC鎖定模式的解釋:Link。搜索OPTIMISTIC(READ)LockMode示例。 就像我理解的那樣,在線程1中設置讀取鎖定對線程2 ... n沒有影響。所有其他線程仍然可以讀取和寫入實體。但是,當線程1中的事務提交併且另一個線程更新了該實體時,線程1中的事務將回滾。

我的理解是正確的嗎?

回答

4

閱讀是curently反正過時,但只是你的理解:

讀鎖將確保對象的狀態不改變提交,因爲讀鎖允許其他事務更新或刪除它,然後,如果線程1做了一些改變,然後提交它首先檢查實體的狀態(版本),如果它檢查,它提交,如果不是不允許的話,

如此基本上你的理解是正確的。

還有OPTIMISTIC_READ這是使用它(ASLO有_write)的現代生活方式。

UPDATE

確定這article幫了我很多理解希望這有助於。

+0

我還是不明白。有人可以重組句子或增加一個例子嗎? – stoefln 2014-04-09 18:22:00

+0

我更新了我的答案,請檢查我提供的鏈接 – engma 2014-04-10 11:31:21