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