在數據庫并發控制的領域中,樂觀鎖和悲觀鎖是兩個比較常見的概念。
悲觀鎖是指在數據進行修改、刪除、查詢時,會將整張表或者某一行記錄鎖住,保證此時其他事務不能對數據進行修改操作。這種方式對于并發控制來說比較重,但是效率比較低。MySQL中使用了行鎖和表鎖來進行悲觀鎖控制。即通過lock in share mode和for update語句來實現。
SELECT * FROM test WHERE id = 1 FOR UPDATE; UPDATE test SET name = 'test' WHERE id = 1;
樂觀鎖,則是在執行修改操作時,先不進行數據鎖定,而是在訪問數據之前查詢版本號或者時間戳,然后在更新或者修改時判斷是否有其他人已經修改了當前版本的數據。如果是,則執行回滾操作,重新執行修改。樂觀鎖相對于悲觀鎖來說,在保證數據完整性的前提下,對于不會出現沖突的讀操作,能夠提高性能。
MySQL中使用了版本號來實現樂觀鎖控制。即通過將表中的版本號加1來實現。在執行修改操作時,判斷當前操作行記錄的版本號和預期的版本號是否相同,如果相同,則修改成功,否則回滾操作。
UPDATE test SET name = 'test', version = version + 1 WHERE id = 1 AND version = 1;
綜合來說,樂觀鎖適合并發寫操作比較少的場景,而悲觀鎖適合并發寫操作比較多的場景。在實際應用中,需要根據具體情況來選擇鎖機制。