2015-12-23 14 views
2

最近我一直在學習數據庫事務和一個文章引述如下當具有@Version註解的字段或屬性的實體時,如何自動啓用樂觀鎖?

JPA通過@Version annotation.When提供自動支持行版本的你有實體@Version annotatted字段或屬性,樂觀鎖會自動啓用。

我的理解是,數據庫隔離級別的策略是使用不同的鎖狀

  1. 讀未提交維護:獨家寫鎖
  2. 讀致力於實現:使用共享讀鎖和排他寫鎖來實現。

等。所以,事務隔離是通過不同的鎖定實現的,我使用悲觀鎖定來實現。

我的問題是當一個字段被聲明爲@Version annotatted它是否覆蓋默認的隔離級別和樂觀鎖定發生?

回答

2

不,他們是不同的東西。默認情況下,隔離級別配置爲read-commited,因此在事務提交之前不能讀取任何更改。

如果您決定使用由@Version手段樂觀鎖,你不改變隔離級別可言,但它假定您要使用read-commited隔離級別,因爲我覺得它有沒有必要使用read-uncommitedread-serialized時你正在使用樂觀鎖定,但你可以。

您可以在創建事務時定義隔離級別,通常指定事務的只讀模式,隔離級別,傳播模式和名稱。

樂觀鎖定由ORM基礎結構控制,在持續時照顧對象的正確數字版本。所以,他們是不同的東西。

希望它有幫助!

1

不,您無法用JPA的樂觀鎖定覆蓋底層數據庫的隔離級別

如果你以某種方式能夠做到這一點,那麼做不好。

大多數數據庫採用READ_COMMITED隔離級別作爲其默認值。

考慮以下場景下的READ_COMMITED隔離級別。

  • 兩個經理加載Product實體
  • 他們都決定增加價格,然後將其保存。
  • 一個價格更新先於另一個提交。
  • 所以一個經理的價格將會被其他經理的價格所忽略,而經理們不知道這個價格。

雖然這種情況很瑣碎,但這些事情可能發生在非平凡的情況下。

這意外的情況本來是可以避免使用樂觀鎖與數據庫的默認隔離級別。

希望這會有所幫助。

+0

tharindu_DG在我的情況我正在使用mysql數據庫,默認隔離級別是可重複讀取。所以,隨着隔離級別可重複讀取,我可以使用基於我的要求的樂觀鎖定或悲觀鎖定,對嗎? –

+0

'可重複讀取'是一個更高的讀取提交隔離級別,因爲它不僅阻止了寫入,而且還阻止了讀取,以避免'不可重複讀取'問題。無論如何,我想它與樂觀鎖定是兼容的。 – malaguna