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