2015-06-11 38 views
5

我已閱讀有關事務隔離級別。它用於防止並行事務執行錯誤。它很明顯。 也有實體可用的鎖定模式。我明白他們是如何工作的。JPA差異事務隔離和實體鎖定

但我找不到我需要鎖定的原因?我已經使用了事務隔離級別。爲什麼我必須使用鎖定? 做隔離級別和鎖定做同樣的工作?

+0

鎖定也可以在數據庫級別,以便Web應用程序之外的其他操作不會修改數據庫數據。 –

+0

因此,當我使用註釋中的事務隔離級別通過鎖定實現時? – bossman

回答

5

引言

有不同的鎖定類型和隔離級別。一些locking types(OPTIMISTIC *)在JPA級別上實現(例如在EclipseLink或Hibernate中),而其他(PESSIMISTIC *)由JPA提供者委派給DB級別。

說明

隔離級別和鎖定是不一樣的,但他們可能某處相交。如果你有SERIALIZED隔離級別(這是性能貪婪),那麼你不需要在JPA中做任何鎖定,因爲它已經由數據庫完成了。另一方面,如果您選擇READ_COMMITTED,那麼您可能需要進行一些鎖定,因爲單獨的隔離級別不能保證您的條件不會在另一個事務中被更改。

+1

我認爲,數據庫隔離級別(悲觀鎖定包括可序列化)不能擴展到典型的交互式Web應用程序,因爲讀寫通常是在單獨的事務中完成的。它需要數據庫連接和事務在整個編輯期間(從讀取到寫入)保持打開狀態,這在交互式Web應用程序中是非常不可取的。 – Tiny

4

事務隔離和JPA實體鎖定都是併發控制機制。

transaction isolation應用於JDBC連接級別,範圍本身就是事務生命週期(您不能從當前正在運行的事務中更改事務隔離)。現代數據庫允許您同時使用隔離級別2PL (two-phase locking)MVCC(SNAPSHOT_ISOLATION或PostgreSQL隔離級別)。在MVCC中,讀者不會阻止作者,作者也不會阻止讀者(只有作者阻止作者)。

Java Persistence Locking API同時提供數據庫級和應用級的併發控制,它可以在兩個類別進行分割:

  1. 顯樂觀鎖模式:

樂觀鎖定在UPDATE/DELETE語句中使用版本檢查,並在版本不匹配時失敗。

  • 顯悲觀鎖模式:

  • 悲觀鎖模式使用一個特定的數據庫鎖定語法獲取讀(共享)或寫(獨佔)鎖(例如,SELECT ... FOR UPDATE)。

    當您在較低的一致性隔離級別(READ_COMMITTED)上運行並且您想要獲取作用域爲upgraded from query life-time to a transaction life-time的鎖時,explicit lock mode適用。