java持久性与安全性_Java持久性锁定初学者指南
java持久性與安全性
隱式鎖定
在并發(fā)理論中,鎖定用于保護(hù)可變共享數(shù)據(jù)免受危險(xiǎn)數(shù)據(jù)完整性異常的影響。 因?yàn)殒i管理是一個(gè)非常復(fù)雜的問(wèn)題,所以大多數(shù)應(yīng)用程序都依賴于其數(shù)據(jù)提供程序隱式鎖技術(shù)。
將整個(gè)鎖定職責(zé)委托給數(shù)據(jù)庫(kù)系統(tǒng)既可以簡(jiǎn)化應(yīng)用程序開(kāi)發(fā),又可以防止諸如死鎖之類的并發(fā)問(wèn)題。 死鎖仍然可能發(fā)生,但是數(shù)據(jù)庫(kù)可以檢測(cè)并采取安全措施(任意釋放兩個(gè)競(jìng)爭(zhēng)鎖之一)。
物理鎖
大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)使用共享(讀取)和排他(寫(xiě)入)鎖,這歸因于特定的鎖定元素(行,表)。 盡管SQL標(biāo)準(zhǔn)要求物理鎖定,但是悲觀的方法可能會(huì)阻礙可伸縮性。
現(xiàn)代數(shù)據(jù)庫(kù)已實(shí)現(xiàn)了輕量級(jí)鎖定技術(shù),例如多版本并發(fā)控制 。
隱式數(shù)據(jù)庫(kù)鎖定隱藏在事務(wù)隔離級(jí)別配置的后面。 每個(gè)隔離級(jí)別都帶有預(yù)定義的鎖定方案,旨在防止某些數(shù)據(jù)完整性異常集。
READ COMMITTED對(duì)當(dāng)前事務(wù)修改的數(shù)據(jù)使用查詢級(jí)共享鎖和排他鎖。 REPEATABLE READ和SERIALIZABLE在讀取時(shí)使用事務(wù)級(jí)共享鎖,在寫(xiě)入時(shí)使用互斥鎖。
邏輯鎖
如果數(shù)據(jù)庫(kù)鎖定足以用于批處理系統(tǒng),則多請(qǐng)求Web流將跨越多個(gè)數(shù)據(jù)庫(kù)事務(wù)。 對(duì)于長(zhǎng)時(shí)間的對(duì)話 ,邏輯(樂(lè)觀)鎖定機(jī)制更為合適。
與對(duì)話級(jí)別的可重復(fù)讀取存儲(chǔ)結(jié)合使用 ,樂(lè)觀鎖定可以確保數(shù)據(jù)完整性,而無(wú)需犧牲可伸縮性。
JPA支持開(kāi)放式鎖定和持久性上下文可重復(fù)讀取,使其非常適合實(shí)現(xiàn)邏輯事務(wù)。
顯式鎖定
雖然對(duì)于大多數(shù)應(yīng)用程序并發(fā)控制要求,隱式鎖定可能是最佳選擇,但有時(shí)您可能需要更細(xì)粒度的鎖定策略。
大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)都支持查詢時(shí)排他鎖定指令,例如SELECT FOR UPDATE或SELECT FOR SHARE 。 因此,我們可以使用較低級(jí)別的默認(rèn)隔離級(jí)別(READ COMMITTED),同時(shí)為特定事務(wù)方案請(qǐng)求共享或排他鎖。
大多數(shù)樂(lè)觀鎖定實(shí)現(xiàn)只驗(yàn)證修改后的數(shù)據(jù),但是JPA也允許顯式樂(lè)觀鎖定。
JPA鎖定
作為數(shù)據(jù)庫(kù)抽象層,JPA可以從基礎(chǔ)RDBMS提供的隱式鎖定機(jī)制中受益。 對(duì)于邏輯鎖定,JPA還提供了可選的自動(dòng)實(shí)體版本控制機(jī)制。
JPA支持以下操作的顯式鎖定:
- 尋找一個(gè)實(shí)體
- 鎖定現(xiàn)有的持久性上下文實(shí)體
- 刷新實(shí)體
- 查詢通過(guò)JPQL,標(biāo)準(zhǔn)或本機(jī)查詢
顯式鎖類型
LockModeType包含以下樂(lè)觀和悲觀鎖定模式:
| 沒(méi)有 | 在沒(méi)有顯式鎖定的情況下,應(yīng)用程序?qū)⑹褂秒[式鎖定(樂(lè)觀或悲觀) |
| 樂(lè)觀的 | 始終在事務(wù)提交時(shí)發(fā)出版本檢查,因此確保樂(lè)觀鎖定可重復(fù)讀取。 |
| 讀 | 與OPTIMISTIC相同。 |
| OPTIMISTIC_FORCE_INCREMENT | 始終增加實(shí)體版本(即使實(shí)體不變),并在事務(wù)提交時(shí)發(fā)出版本檢查,從而確保樂(lè)觀鎖定可重復(fù)讀取。 |
| 寫(xiě) | 與OPTIMISTIC_FORCE_INCREMENT相同。 |
| PESSIMISTIC_READ | 獲取共享鎖以防止任何其他事務(wù)獲取PESSIMISTIC_WRITE鎖。 |
| PESSIMISTIC_WRITE | 獲取排他鎖以防止任何其他事務(wù)獲取PESSIMISTIC_READ或PESSIMISTIC_WRITE鎖。 |
| PESSIMISTIC_FORCE_INCREMENT | 獲取數(shù)據(jù)庫(kù)鎖以防止任何其他事務(wù)獲取PESSIMISTIC_READ或PESSIMISTIC_WRITE鎖,并且在提交事務(wù)時(shí)會(huì)增加實(shí)體版本。 |
鎖定范圍和超時(shí)
JPA 2.0定義了javax.persistence.lock.scope屬性,采用以下值之一:
- NORMAL由于對(duì)象圖可以跨越多個(gè)表,因此顯式的鎖定請(qǐng)求可能會(huì)傳播到多個(gè)表(例如,聯(lián)接繼承,輔助表)。由于整個(gè)實(shí)體關(guān)聯(lián)的行都被鎖定,因此多對(duì)一和一對(duì)-一對(duì)一的外鍵也將被鎖定,但不會(huì)鎖定另一側(cè)父級(jí)關(guān)聯(lián)。 此范圍不會(huì)傳播到子級(jí)集合。
- 擴(kuò)展顯式鎖將傳播到元素集合和聯(lián)結(jié)表 ,但不會(huì)鎖定實(shí)際的子實(shí)體。 該鎖僅在防止幻像讀取或更改實(shí)際的子實(shí)體狀態(tài)的同時(shí)用于防止刪除現(xiàn)有的子實(shí)體。
JPA 2.0還引入了javax.persistence.lock.timeout屬性,使我們能夠配置鎖定請(qǐng)求在引發(fā)PessimisticLockException之前將等待的時(shí)間(毫秒)。
Hibernate鎖定
Hibernate支持所有JPA鎖定模式和一些其他特定的鎖定選項(xiàng)。 與JPA一樣,可以為以下操作配置顯式鎖定:
- 使用各種LockOptions設(shè)置鎖定實(shí)體。
- 得到一個(gè)實(shí)體
- 加載實(shí)體
- 刷新實(shí)體
- 創(chuàng)建實(shí)體或本機(jī)查詢
- 創(chuàng)建條件查詢
LockModeConverter負(fù)責(zé)映射JPA和Hibernate鎖定模式,如下所示:
| 沒(méi)有 | 沒(méi)有 |
| 樂(lè)觀的 讀 | 樂(lè)觀的 |
| OPTIMISTIC_FORCE_INCREMENT 寫(xiě) | OPTIMISTIC_FORCE_INCREMENT |
| PESSIMISTIC_READ | PESSIMISTIC_READ |
| PESSIMISTIC_WRITE 升級(jí) UPGRADE_NOWAIT UPGRADE_SKIPLOCKED | PESSIMISTIC_WRITE |
| PESSIMISTIC_FORCE_INCREMENT 力 | PESSIMISTIC_FORCE_INCREMENT |
不建議使用UPGRADE和FORCE鎖定模式,而推薦使用PESSIMISTIC_WRITE 。
UPGRADE_NOWAIT和UPGRADE_SKIPLOCKED分別使用Oracle風(fēng)格的select用于更新nowait或select用于更新跳過(guò)鎖定語(yǔ)法。
鎖定范圍和超時(shí)
Hibernate還定義了作用域和超時(shí)鎖定選項(xiàng) :
- 范圍
鎖定范圍允許顯式鎖定級(jí)聯(lián)到所擁有的關(guān)聯(lián) 。 - 超時(shí)
超時(shí)間隔可能會(huì)阻止鎖定請(qǐng)求無(wú)限期地等待。
在我的下一篇文章中,我將介紹不同的顯式鎖定設(shè)計(jì)樣式,敬請(qǐng)期待!
翻譯自: https://www.javacodegeeks.com/2015/01/a-beginners-guide-to-java-persistence-locking.html
java持久性與安全性
總結(jié)
以上是生活随笔為你收集整理的java持久性与安全性_Java持久性锁定初学者指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一加悬浮窗在哪里设置(一加悬浮窗管理在哪
- 下一篇: javadoc 标签_新的Javadoc