阿里面試:MySQL樂觀鎖是什么?底層實現原理?
MySQL樂觀鎖經常在大廠被問到,比如:MySQL樂觀鎖是什么?實現原理?…等,下面我就來詳解MySQL樂觀鎖@mikechen
MySQL樂觀鎖
MySQL樂觀鎖,顧名思義就是很“樂觀”,也就在更新數據時不加鎖,而是通過“版本號”、或“時間戳”來檢測數據是否被修改。
MySQL樂觀鎖實現原理
MySQL的樂觀鎖通過版本號或時間戳機制實現,其核心原理:是在更新數據時檢查數據是否被其他事務修改,從而避免并發沖突。
圖片
實現步驟,如下:
第一:增加“版本號”。
在數據庫表,中添加一個版本號字段,通常命名為 version 。
ALTER TABLE orders ADD COLUMN version INT DEFAULT 1;
這個字段用于記錄數據的版本信息,每當數據被更新時,版本號會自動遞增。
第二:讀取數據。
獲取當前數據的版本號,(如:version字段)、或時間戳。
讀取數據
SELECT id, stock, version FROM product WHERE id = 1;
第三:提交更新。
更新數據時,校驗版本號,是否與讀取時一致。
UPDATE table
SET column1 = new_value, version = version + 1
WHERE id = target_id AND version = old_version;
比如,通過版本號的方式,更新庫存:
更新時校驗版本號
UPDATE product
SET stock = stock - 1, version = version + 1
WHERE id = 1 AND version = 1; -- 假設當前version=1
在更新數據時,檢查 version 字段的值是否與預期一致,如果一致則更新數據并遞增 version 值,否則更新失敗。
圖片
比如:成功(affected rows > 0),更新成功,業務繼續執行。
失敗(affected rows = 0),說明數據已被其他事務修改,需要重新讀取數據并重試。
在讀多寫少的場景下,樂觀鎖不會像悲觀鎖那樣在讀操作時加鎖,從而減少了鎖的開銷,這是MySQL樂觀鎖最大的優點。
適用于數據沖突較少的場景,避免鎖帶來的性能損耗。
但是,在大部分金融交易,要求數據強一致性的場景,則需要悲觀鎖。