資料庫鎖 樂觀鎖 悲觀鎖理解

2021-08-24 20:27:06 字數 1011 閱讀 6113

參考:mysql/innodb中,樂觀鎖、悲觀鎖、共享鎖、排它鎖、行鎖、表鎖、死鎖概念的理解

樂觀鎖最簡單的實現就是在表中加乙個版本號欄位如version,每次新增設定為1,更新的時候檢查版本號是否一致,如果不一致就更新失敗。版本一致才能更新,然後將版本號+1。

首先資料庫需要關閉自動提交功能,或者說是在jdbc中將自動提交設定成false。

共享鎖是當有sql進行查詢的時候加上共享鎖,那麼其他對查詢結果有修改的sql都不能執行,必須等查詢sql結束後釋放鎖才可以。如果是查詢sql,那麼不會受到影響,它也會獲取共享鎖。

普通sql:

from t_bd_person

共享鎖sql:

select id,code,name from t_bd_person lock

in share mode

所以關鍵就是在sql後加上乙個關鍵語句 lock in share mode

排它鎖會排斥其他的排它鎖和共享鎖,所以當一句sql對資料加上排它鎖的時候,其他sql不能對這資料進行讀寫。

普通sql:

update t_bd_person set code='faker',name='lxh'

where id=1

排它鎖sql:

update t_bd_person set code='faker',name='lxh'

where id=1

forupdate

所以關鍵就是在sql後加上乙個關鍵語句 for update

行鎖和表鎖是鎖範圍的限定,它們也是有共享鎖和排它鎖。至於sql什麼時候會鎖定行,什麼時候會鎖定整張表,是需要索引實現的。最簡單的就是如果sql使用到了索引,那麼這句sql就是行鎖,否則sql會獲取表鎖。

死鎖的出現是因為兩個事務相互等待,事務a持有資料a的鎖等待資料b鎖的釋放,事務b持有資料b的鎖等待資料a鎖的釋放。

資料庫之樂觀鎖,悲觀鎖

樂觀鎖 1.只在提交操作時檢查是否違反資料完整性。使用自增長的整數表示資料版本號。更新時檢查版本號是否一致,比如資料庫中資料版本為6,更新提交時version 6 1,使用該version值 7 與資料庫version 1 7 作比較,如果相等,則可以更新,如果不等則有可能其他程式已更新該記錄,所以...

資料庫樂觀鎖與悲觀鎖

每次拿資料的時候都會擔心會被別人修改 疑心重很悲觀 所以每次在拿資料的時候都會上鎖。確保自己使用的過程中不會被別人訪問,自己使用完後再解鎖。期間需要訪問該資料的都會等待。每次拿資料的時候都完全不擔心會被別人修改 心態好很樂觀 所以每次在拿資料的時候都不會上鎖。但是在更新資料的時候去判斷該期間是否被別...

資料庫樂觀鎖與悲觀鎖

演示案例 為何需要樂觀鎖,與悲觀鎖這樣的鎖?idname money 1god 1000 假設god同志的賬上有1000元,現在有兩個執行緒同時往他的賬戶上轉錢。1.a執行緒準備向god賬戶上轉200,讀取到賬戶上有1000元,事務還未提交 2.b執行緒準備向god賬戶上轉100,讀取到賬戶上有10...