innodb支持事務,支持行鎖和表鎖,myisam不支持事務,只支持表鎖。這里只介紹innodb。
InnoDB實現了以下兩種類型的行鎖。
-
共享鎖(S):允許一個事務去讀一行,阻止其他事務獲得相同數據集的排他鎖。
-
排他鎖(X):允許獲得排他鎖的事務更新數據,阻止其他事務取得相同數據集的共享讀鎖和排他寫鎖。
另外,為了允許行鎖和表鎖共存,實現多粒度鎖機制,InnoDB還有兩種內部使用的意向鎖(Intention Locks),這兩種意向鎖都是表鎖。
-
意向共享鎖(IS):事務打算給數據行加行共享鎖,事務在給一個數據行加共享鎖前必須先取得該表的IS鎖。
-
意向排他鎖(IX):事務打算給數據行加行排他鎖,事務在給一個數據行加排他鎖前必須先取得該表的IX鎖。
InnoDB行鎖模式兼容性列表
請求鎖模式 ? ???是否兼容 ? 當前鎖模式 |
X | IX | S | IS |
X | 沖突 | 沖突 | 沖突 | 沖突 |
IX | 沖突 | 兼容 | 沖突 | 兼容 |
S | 沖突 | 沖突 | 兼容 | 兼容 |
IS | 沖突 | 兼容 | 兼容 | 兼容 |
如果一個事務請求的鎖模式與當前的鎖兼容,InnoDB就將請求的鎖授予該事務;反之,如果兩者不兼容,該事務就要等待鎖釋放。
說明:
-
意向鎖是InnoDB自動加的,不需用戶干預。
-
對于UPDATE、delete和INSERT語句,InnoDB會自動給涉及數據集加排他鎖(X)。
-
對于普通SELECT語句,InnoDB不會加任何鎖。
-
InnoDB行鎖是通過給索引上的索引項加鎖來實現的,因此InnoDB這種行鎖實現特點意味著:只有通過索引條件檢索數據,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖。
另外,事務可以通過以下語句顯式給記錄集加共享鎖或排他鎖。
-
共享鎖(S):SELECT * FROM table_name WHERE … LOCK IN SHARE MODE。
-
排他鎖(X):SELECT * FROM table_name WHERE … FOR UPDATE。
用SELECT … IN SHARE MODE獲得共享鎖,主要用在需要數據依存關系時來確認某行記錄是否存在,并確保沒有人對這個記錄進行UPDATE或者DELETE操作。但是如果當前事務也需要對該記錄進行更新操作,則很有可能造成死鎖,對于鎖定行記錄后需要進行更新操作的應用,應該使用SELECT… FOR UPDATE方式獲得排他鎖。
以上就是MySQL事務、鎖以及應用(二)的內容,更多相關內容請關注PHP中文網(www.php.cn)!