JAVA樂觀鎖、悲觀鎖實現
阿新 • • 發佈:2017-09-04
個數 自動 時間 update 頻繁 每次 調用 內部實現 字段
一、名詞解釋
1、悲觀鎖:認為每次對數據庫的操作(查詢、修改)都是不安全的,因此每次操作都會把這條數據鎖掉,直到本次操作完畢釋放該鎖
2、樂觀鎖:查詢數據的時候總是認為是安全的,不會鎖數據;等到更新數據的時候會判斷這個數據是否被人修改過,如果有人修改過了則本次修改失敗
二、使用過程
1、悲觀鎖:悲觀鎖的內部實現是采用的數據庫內部的鎖機制,一個典型的依賴數據庫的悲觀鎖調用:
SELECT * FROM TABLE WHERE ID=‘1‘ FOR UPDATE;
這條語句鎖定了TABLE表總id=‘1‘的這條數據,本次事務提交之前(事務提交後會釋放事物終的鎖)外界無法修改本條記錄,同時也保證了本條數據的準確性;
悲觀鎖缺陷:如果在高並發的情況下,每條數據都排隊按照以上過程去加鎖、運行、解鎖,那麽可想而知執行時間,等待時間是非常長的,用戶體驗是非常差的
2、樂觀鎖:樂觀鎖的實現方式有兩種:1是添加version字段每次修過疊加;2是使用updatetime每次更新數據後系統自動更新
UPDATE TABLE SET NAME=‘DD‘ WHERE UPDATETIME=‘查詢出的時間‘AND ID=‘1‘
UPDATETIME也可換成version 在where條件加上這兩天自動更新字段,如果不符合說明有改動
樂觀鎖缺陷:如果修過特別頻繁沖突特別多的情況下會導致很多操作都失敗
JAVA樂觀鎖、悲觀鎖實現