【面試干貨】數據庫樂觀鎖,悲觀鎖的區別,怎么實現
- 1、樂觀鎖,悲觀鎖的區別
- 2、總結
💖The Begin💖點點關注,收藏不迷路💖 |
1、樂觀鎖,悲觀鎖的區別
- 悲觀鎖(Pessimistic Lock)
定義: 每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞掛起直到它拿到鎖。
實現: 傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖,讀鎖,寫鎖等,都是在做操作之前先上鎖。
特點:適用于寫操作頻繁的場景,但可能會降低并發性能,因為上鎖會阻塞其他操作的進行。
示例代碼(偽代碼):
-- 悲觀鎖示例(以行鎖為例)
SELECT * FROM table_name WHERE id = 1 FOR UPDATE; -- 對id為1的行加鎖
- 樂觀鎖(Optimistic Lock)
定義: 每次去拿數據的時候都認為別人不會修改數據,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據。
實現:版本號機制
(如:為數據表增加一個版本號字段,在更新數據時判斷版本號是否變化)或者時間戳機制(使用數據的最后更新時間戳,在更新時判斷時間戳是否發生變化)是常見的樂觀鎖實現方式。
特點:適用于多讀少寫的場景,可以提高系統的整體吞吐量。但如果沖突頻繁,上層應用會不斷重試,降低性能。
示例代碼(偽代碼):
-- 樂觀鎖示例(以版本號為例)
UPDATE table_name SET column1 = value1, version = version + 1 WHERE id = 1 AND versio
old_version 是之前讀取到的版本號,如果更新操作影響的行數為0,則表示在此期間有其他事務已經修改了數據,需要重試。
2、總結
選擇:
1、根據實際應用場景選擇使用悲觀鎖還是樂觀鎖。 如果寫操作較少,且希望提高系統吞吐量,可以考慮使用樂觀鎖;
2、如果寫操作頻繁,且希望減少數據沖突,可以考慮使用悲觀鎖
。
注意: 在使用樂觀鎖時,需要合理設置重試次數和重試間隔,避免頻繁重試導致性能下降。同時,需要確保在更新數據時能夠正確判斷數據是否被其他事務修改過。
💖The End💖點點關注,收藏不迷路💖 |