說兩個維度:
共享鎖(簡稱S鎖)和排他鎖(簡稱X鎖)
讀鎖是共享的,可以通過lock in share mode實現,這時候只能讀不能寫。
寫鎖是排他的,它會阻塞其他的寫鎖和讀鎖。從顆粒度來區分,可以分為表鎖和行鎖兩種。
表鎖和行鎖
表鎖會鎖定整張表并且阻塞其他用戶對該表的所有讀寫操作,比如alter修改表結構的時候會鎖表。
行鎖又可以分為樂觀鎖和悲觀鎖
悲觀鎖可以通過for update實現
樂觀鎖則通過版本號實現。
兩個維度結合來看:
共享鎖(行鎖):Shared Locks
讀鎖(s鎖),多個事務對于同一數據可以共享訪問,不能操作修改
使用方法:
加鎖:SELECT * FROM table WHERE id=1 LOCK IN SHARE MODE
釋鎖:COMMIT/ROLLBACK
排他鎖(行鎖):Exclusive Locks
寫鎖(X鎖),互斥鎖/獨占鎖,事務獲取了一個數據的X鎖,其他事務就不能再獲取該行的讀鎖和寫鎖(S鎖、X鎖),只有獲取了該排他鎖的事務是可以對數據行進行讀取和修改
使用方法:DELETE/ UPDATE/ INSERT -- 加鎖
SELECT * FROM table WHERE ... FOR UPDATE -- 加鎖
COMMIT/ROLLBACK -- 釋鎖
意向共享鎖(IS)
一個數據行加共享鎖前必須先取得該表的IS鎖,意向共享鎖之間是可以相互兼容的 意向排它鎖(IX) 一個數據行加排他鎖前必須先取得該表的IX鎖,意向排它鎖之間是可以相互兼容的 意向鎖(IS、IX)是InnoDB引擎操作數據之前自動加的,不需要用戶干預; 意義: 當事務操作需要鎖表時,只需判斷意向鎖是否存在,存在時則可快速返回該表不能啟用表鎖
意向共享鎖(IS鎖)(表鎖):Intention Shared Locks
表示事務準備給數據行加入共享鎖,也就是說一個數據行加共享鎖 前必須先取得該表的IS鎖。
意向排它鎖(IX鎖)(表鎖):Intention Exclusive Locks
表示事務準備給數據行加入排他鎖,說明事務在一個數據行加排他 鎖前必須先取得該表的IX鎖。