(之所以以InnoDB爲主介紹鎖,是因爲InnoDB支持事務,支持行鎖和表鎖用的比較多,Myisam不支持事務,只支持表鎖)
1、共享鎖(S):允許一個事務去讀一行,阻止其他事務獲得相同數據集的排他鎖。(可以讀)
2、排他鎖(X):允許獲得排他鎖的事務更新數據,阻止其他事務取得相同數據集的共享讀鎖和排他寫鎖。(可以寫)
3、意向共享鎖(IS):事務打算給數據行加行共享鎖,事務在給一個數據行加共享鎖前必須先取得該表的IS鎖。
4、意向排他鎖(IX):事務打算給數據行加行排他鎖,事務在給一個數據行加排他鎖前必須先取得該表的IX鎖。
說明:
1)共享鎖和排他鎖都是行鎖,意向鎖都是表鎖,應用中我們只會使用到共享鎖和排他鎖,意向鎖是mysql內部使用的,不需要用戶干預。
2)對於UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及數據集加排他鎖(X);對於普通SELECT語句,InnoDB不會加任何鎖,事務可以通過以下語句顯示給記錄集加共享鎖或排他鎖。
l 共享鎖(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
l 排他鎖(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
3)InnoDB行鎖是通過給索引上的索引項加鎖來實現的,因此InnoDB這種行鎖實現特點意味着:只有通過索引條件檢索數據,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖!。