1. 程式人生 > >解決並發問題,數據庫常用的兩把鎖——悲觀鎖,樂觀鎖

解決並發問題,數據庫常用的兩把鎖——悲觀鎖,樂觀鎖

weixin 自己 解決 如果 cat and 機制 同事 進行

一、概念:

樂觀鎖:適用於寫少讀多的情景,因為這種樂觀鎖相當於java的cas(比較並替換),所以多條數據同事過來的時候不用等待,可以立即進行返回

悲觀鎖:適用於寫多讀少的情景,這種情況也相當於java的synchronized,reentrantLock等,大量數據過來的時候,只有一條被寫入,其他數據需要等待,智行完成後下一條數據繼續。

二:實現方式:

樂觀鎖:采用版本號的方式。即當前版本號如果對應上了就可以寫入數據,如果判斷當前版本號不一致,那麽就不會更新成功。

比如

  1. update table set column = value

  2. where version=${version} and otherKey = ${otherKey}

悲觀鎖實現的機制一般是在執行更新語句的時候采用for update方式,比如

  1. update table set column=‘value‘ for update

這種情況where條件呢一定要涉及到數據庫對應的索引字段,這樣才會是行級鎖,否則會是表鎖,這樣執行速度會變慢。

實現樂觀鎖的方式有兩種:

  1. 更新的時候將version字段傳過來,然後更新的時候就可以進行version判斷,如果version可以匹配上,那麽就可以更新(方法:updateCatalogWithVersion)。

  2. 在實體類上的version字段上加入version,可以不用自己寫SQL語句就可以它就可以自行的按照version匹配和更新,是不是很簡單。 

實現悲觀鎖的時候也有兩種方式:

  1. 自行寫原生SQL,然後寫上for update語句。(方法:findCatalogsForUpdate)

  2. 使用@Lock註解,並且設置值為LockModeType.PESSIMISTIC_WRITE即可代表行級鎖。

鏈接(https://mp.weixin.qq.com/s/mGDGA-_dKehavAqsY7gauA)

解決並發問題,數據庫常用的兩把鎖——悲觀鎖,樂觀鎖