樂觀鎖悲觀鎖

2021-08-04 08:14:14 字數 829 閱讀 4124

悲觀鎖(pessimistic lock)顧名思義,就是很悲觀,每次獲取資料的時候都認為會修改資料,因此每次在獲取資料的時候都會對此條資料進行鎖定,也就是mysql資料庫的行鎖,這樣別人每次想拿到這個資料的時候就會block直到他拿到鎖,mysql資料庫類似的機制還有表鎖,讀鎖,寫鎖等,都是在操作前先上鎖。

樂觀鎖(optimistic lock)顧名思義,就是很樂觀,每次獲取資料的時候都認為不會修改資料,但是在更新的時候會去判斷一下此條資料別人有沒有進行更改,常用的方法是版本號機制,也可以使用時間戳進行判斷,樂觀鎖適合寫比較少的情況下,即多讀型別,這樣可以提高系統吞吐量,就像資料庫提供類似於write_condition機制的其實都是提供的樂觀鎖。

兩種鎖各有其優缺點,如果是讀操作遠遠大於寫操作適合用樂觀鎖,畢竟省去了鎖的開銷,如果經常進行寫操作使用樂觀鎖反而會影響系統效能,導致上層應用不斷地進行retry,這個時候還是選擇悲觀鎖比較合適。

關於樂觀鎖兩種實現機制

如上圖所示,如果更新操作順序執行,則資料的版本(version)依次遞增,不會產生衝突。但是如果發生有不同的業務操作對同一版本的資料進行修改,那麼,先提交的操作(圖中b)會把資料version更新為2,當a在b之後提交更新時發現資料的version已經被修改了,那麼a的更新操作會失敗。

2.樂觀鎖定的第二種實現方式和第一種差不多,同樣是在需要樂觀鎖控制的table中增加乙個字段,名稱無所謂,字段型別使用時間戳(timestamp), 和上面的version類似,也是在更新提交的時候檢查當前資料庫中資料的時間戳和自己更新前取到的時間戳進行對比,如果一致則ok,否則就是版本衝突。

但是不管是那種鎖,對於高併發情況下都不能完全解決併發問題,更何況悲觀鎖還不能解決幻讀問題

悲觀鎖樂觀鎖

1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...

樂觀鎖 悲觀鎖

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...

樂觀鎖 悲觀鎖

樂觀鎖 悲觀鎖 悲觀鎖 pessimistic locking 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保...