MySQL數據庫系統使用行級鎖(row level locking)實現對數據庫中數據的操作控制,它允許多個用戶同時對同一表進行讀操作(共享鎖), 而對于寫操作則只允許一個用戶進行(排它鎖)。
在MySQL中,按照鎖粒度的不同,可以將鎖分為表級鎖和行級鎖。表級鎖占有粒度大,加鎖快,但并發度低,而行級鎖占用粒度小,可以表現出很高的并發度,但加鎖和釋放鎖的代價也相對較大。
MySQL提供了兩種鎖機制:
- 共享鎖(S鎖)
SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;
SELECT * FROM table_name WHERE condition FOR UPDATE;
共享鎖是在讀數據時使用,使用共享鎖的事務可以從數據庫中讀取該數據,但不能修改該數據。排他鎖是在寫數據時使用,使用排他鎖的事務可以讀取并修改該數據,其他事務不能訪問該數據。
在使用加鎖時,開發者還需要注意,如果事務不加S鎖,會在讀取數據后繼續執行其他操作,而在再次讀取數據時會重新檢索一遍,可能會改變數據的狀態,開發者應該根據實際需求選擇是否需要對數據加鎖。而對于被鎖定的數據,MySQL會自動在該事務commit或rollback后釋放鎖。