Hibernate的悲觀鎖和樂觀鎖

2022-03-24 11:03:21 字數 1524 閱讀 7875

前一篇部落格我們從資料庫角度分析,鎖可以分為三種,分別為共享鎖,獨佔鎖和更新鎖。我們從程式的角度來看鎖可以分為兩種型別,悲觀鎖和樂觀鎖,hibernate提供對這兩種鎖 的支援,我們來了解一下hibernate如何實現這兩種鎖。

通常由資料庫機制實現,在查詢的整個過程中把資料鎖住,只要事務不釋放(提交/回滾),那麼其他任何使用者都不能檢視或修改資料,這種鎖的方式是比較簡單、直接。從開始就講資料全部鎖上,這種鎖主要針對併發修改造成資料不一致的問題,但同時也會造成死鎖的發生。

適用場景:適合短事務

示例:兩個使用者同時去到同乙個資料100,使用者1先將資料減20,這時資料庫裡的是80,使用者2剛才讀取到的是100,現在使用者2,這樣就會造成資料混亂。採用鎖的方式解決這種問題。

悲觀鎖:在使用者1讀取資料的時候,用鎖將資料鎖上,而使用者2讀取不到資料,只要使用者1將資料修改後並提交,才釋放鎖,此時使用者2才能讀取到資料,而這時候讀取到的是使用者1修改後的資料,也就解決了資料混亂的問題了。

實體類:

public class inventory 

public string getitemname()

public void setitemname(string itemname)

public int getquantity()

public void setquantity(int quantity)

}

配置檔案:

lockmodel(使用upgrade)

public void testload1()catch(exception e)finally

}

不是鎖,是一種衝突檢測機制,樂觀鎖的併發性要好於悲觀鎖。常用的方式可以使用資料版本的方式(version)實現,一般是在資料庫中加入乙個version欄位,在讀取資料的時候將version欄位讀取出來,在儲存資料的時候判斷version的值是否小於資料庫中version的版本,如果小於不予更新,否則更新資料。

實體類:

在實體類配置中新增上版本的對映

public class inventory 

public void setversion(int version)

public string getitemno()

public void setitemno(string itemno)

public string getitemname()

public void setitemname(string itemname)

public int getquantity()

public void setquantity(int quantity)

}

配置檔案:

使用方式還是和之前的一樣,這樣在更新之前就會跟資料庫中版本對比,能夠更好的解決資料混亂的問題。

總結:資料庫新增鎖的兩種方式,悲觀鎖簡單明瞭,它將一切都以悲觀的眼光來看待,認為一切都是併發的,而且當資料庫很大或者遇到問題就很容易造成死鎖。樂觀鎖的方式更加和諧,能夠更好的處理併發問題。

hibernate悲觀鎖和樂觀鎖

如果資料庫不加鎖,在多個使用者訪問的時候,有可能會造成不可重複讀的問題 如,兩個使用者進行更新,並且這兩個使用者都先後的拿到了表中的記錄的數值,a使用者更新比 b使用者先更新完,但 b使用者還是按照初始的值進行更新,這時候就會造成不可重複讀 此時可以通過hibernate的悲觀鎖機制,對 hiber...

hibernate悲觀鎖和樂觀鎖

1.悲觀鎖 它指的是對資料被外界修改持保守態度。假定任何時刻訪問資料時,都可能有另乙個客戶也正在訪問同一筆資料,為了保持資料被操作的一致性,於是對資料採取了資料庫層次的鎖定狀態,依靠資料庫提供的鎖機制來實現。基於jdbc實現的資料庫加鎖如下 select from account where nam...

Hibernate 悲觀鎖和樂觀鎖

悲觀鎖 認為在修改資料庫資料的這段時間裡存在著也想修改此資料的事務!樂觀鎖 認為在短暫的時間裡不會有事務來修改此資料庫的資料!悲觀鎖 基於jdbc實現的資料庫加鎖如下 select from account where name erica for update.在更新的過程中,資料庫處於加鎖狀態,...