天天看點

樂觀鎖與悲觀鎖|學習筆記樂觀鎖與悲觀鎖

開發者學堂課程【Java面試疑難點串講2:樂觀鎖與悲觀鎖】學習筆記,與課程緊密聯系,讓使用者快速學習知識。

課程位址: https://developer.aliyun.com/learning/course/25

樂觀鎖與悲觀鎖

悲觀鎖本質上是資料庫自身所具備的一種處理機制,在資料庫的事務裡面有一個隔離性的概念,其主要特征是當一個session操作某條資料的時候,其他的session無法操作(見oracle資料庫的事務課程),這是一種鎖的實作,是資料庫自帶的功能。

之前都是針對更新的操作使用的鎖,如果在做查詢時也使用鎖,就需加上FOR UPDATE:

語句:SELECT*FROM 表名稱FOR UPDATE;

      表示使用悲觀鎖,在事務送出或復原之前該資料都不允許更新。

樂觀鎖是不使用資料庫鎖的處理(不推薦),需在使用的資料表追加一個字段,而這個字段用于做一個版本号。例如,正常情況下使用者表可能隻有mid、password,但若使用了悲觀鎖則還需追加有一個字段的列,這個列辨別版本号:

樂觀鎖與悲觀鎖|學習筆記樂觀鎖與悲觀鎖

現假設有一條資料:LNSERTINTO member(mid,name,ver)VALUES(‘mldn’,‘hello’,0);

 現假設有兩個session要進行該資料的讀取,由于沒有使用悲觀鎖,是以兩個session均可對該資料進行修改,第一個session修改之後将版本号做了“+1”處理,變為1,而後一個·session更新時發現版本号不對,則不允許更新。

樂觀鎖是基于算法的一種實作,實際操作麻煩,雖在Hibernate設計架構中有此概念,但從開發角度看,建議交由資料庫自行處理(使用悲觀鎖)。