解決並發問題,數據庫常用的兩把鎖——悲觀鎖,樂觀鎖
一、概念:
樂觀鎖:適用於寫少讀多的情景,因為這種樂觀鎖相當於java的cas(比較並替換),所以多條數據同事過來的時候不用等待,可以立即進行返回
悲觀鎖:適用於寫多讀少的情景,這種情況也相當於java的synchronized,reentrantLock等,大量數據過來的時候,只有一條被寫入,其他數據需要等待,智行完成後下一條數據繼續。
二:實現方式:
樂觀鎖:采用版本號的方式。即當前版本號如果對應上了就可以寫入數據,如果判斷當前版本號不一致,那麽就不會更新成功。
比如
-
update table set column = value
-
where version=${version} and otherKey = ${otherKey}
悲觀鎖實現的機制一般是在執行更新語句的時候采用for update方式,比如
-
update table set column=‘value‘ for update
這種情況where條件呢一定要涉及到數據庫對應的索引字段,這樣才會是行級鎖,否則會是表鎖,這樣執行速度會變慢。
實現樂觀鎖的方式有兩種:
-
更新的時候將version字段傳過來,然後更新的時候就可以進行version判斷,如果version可以匹配上,那麽就可以更新(方法:updateCatalogWithVersion)。
-
在實體類上的version字段上加入version,可以不用自己寫SQL語句就可以它就可以自行的按照version匹配和更新,是不是很簡單。
實現悲觀鎖的時候也有兩種方式:
-
自行寫原生SQL,然後寫上for update語句。(方法:findCatalogsForUpdate)
-
使用@Lock註解,並且設置值為LockModeType.PESSIMISTIC_WRITE即可代表行級鎖。
鏈接(https://mp.weixin.qq.com/s/mGDGA-_dKehavAqsY7gauA)
解決並發問題,數據庫常用的兩把鎖——悲觀鎖,樂觀鎖