java 持久_Java持久锁总结 -解道Jdon
并發主題
Java與持久相關的鎖總結
本文總結Java中有關數據庫保存持久數據的鎖機制,不只是純粹數據庫自身的鎖,本文主要就Java持久層三個技術數據庫、JPA和Hibernate的鎖應用進行了總結。
在并發理論中,鎖是用于保護可變的共享數據,以保證數據的完整性,大多數應用程序都是依賴于數據庫本身提供的隱藏在數據庫機制內的鎖技術,很多初學者可能都沒有意識到。
將整個系統的鎖職責委托給數據庫系統,雖然可以簡化應用程序的開發,防止并發問題如死鎖,但是還是有可能出現死鎖的,但是數據庫可以檢測到并采取安全措施,比如任意釋放兩個競爭鎖中一個。
物理鎖
大多數的數據庫系統使用的是共享讀鎖和排他寫鎖,這是因為其特定的鎖元素(行 表),而物理鎖是由SQL標準確定的,其悲觀的方式可能或妨礙系統的伸縮擴展性Scalable。
大多數數據庫是使用輕量的鎖技術,比如多版本并發控制,隱式的數據庫鎖機制的背后是事物隔離級別設置ACID,每個隔離級別是一個預定義的鎖方案,目的是防止某一組數據的完整性異常。
READ COMMITTED(已提交讀取)是使用查詢級別的共享鎖,對于當前事務中修改數據的操作采取排他鎖,REPEATABLE?(可重復讀)和SERIALIZABLE?(序列化)是在讀取和寫入排他鎖需要時使用事務級別的共享鎖。
邏輯鎖
如果說數據庫鎖對于批處理系統已經足夠,那么對于跨越多個數據庫的多個Web請求來說,這種長對話事務需要一個邏輯(樂觀)鎖機制則是更合適些。
Hibernate提供的樂觀鎖(conversation-level repeatable read storage)可以確保數據的完整性,但是缺乏交易的可擴展性;JPA提供樂觀鎖和持久上下文可重復讀兩種機制,為實現邏輯鎖提供了多樣選擇。
顯式鎖
前面提到由數據庫和持久框架提供的隱式鎖已經滿足大多數應用程序的并發控制要求了,但是有時如果你需要一個更細粒度的鎖策略,那么就需要使用顯式鎖了。
大多數數據庫系統支持查詢時間獨占鎖指令,如?SELECT FOR UPDATE or SELECT FOR SHARE,因此我們可以使用較低級別的默認隔離級別(READ COMMITTED),而具體交易情況,使用共享和獨占鎖。
大部分樂觀鎖實現只是驗證修改的數據,但是JPA允許你明確指定樂觀鎖的方式。
JPA鎖
作為數據庫抽象層,JPA能夠從底層RDBMS鎖獲得隱式的鎖機制,JPA也提供優化可選自動的尸體版本控制機制。JPA提供顯式鎖為了如下操作:
locking?鎖定一個存在的持久化上下文實體
querying?通過JPQL查詢, 或通過Criteria 或數據庫SQL查詢
顯式鎖類型
LockModeType?包含下面樂觀和悲觀鎖模式:
鎖作用域和超時
JPA 2.0通過下面值定義javax.persistence.lock.scope:
NORMAL因為對象圖會跨越多個數據表,一個顯式鎖也會涉及到多個表(例如 joined inheritance, secondary tables).因為整個實體相關聯的行被鎖住,many-to-one多對一和一對一one-to-one外鍵將鎖定,但不會鎖定對方父關聯,這個作用域不會涉及到子集。
EXTENDED這個顯式鎖將涉及到元素集合和junction tables, 但是不會實際鎖定子實體,這個鎖用于防止刪除現有的子對象是有用的,同時允許幻讀phantom reads或實際子實體狀態的改變。
JPA 2.0也引入了javax.persistence.lock.timeout屬性,我們能夠配置多少毫秒超時,這樣一個請求在這個鎖必須等待一直到過了超時,然后會拋出PessimisticLockException。
Hibernate鎖
Hibernate支持所有JPA鎖模型,有一些附加的特定鎖選項,顯式鎖能針對如下操作配置:
創建一個實體或原生數據庫查詢Query
創建一個creating aCriteriaquery
LockModeConverter是負責JPA和Hibernate鎖模型映射:
總結
以上是生活随笔為你收集整理的java 持久_Java持久锁总结 -解道Jdon的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直线电机的matlab仿真,基于MATL
- 下一篇: 软件构造第一篇博客(“可变形与不可变性”