Mysql-InnoDB 鎖學習
鎖型別
行級鎖
鎖模式只有LOCK_S 和LOCK_X,其他的 FLAG 用於鎖的描述,如前述 LOCK_GAP、LOCK_REC_NOT_GAP 以及 LOCK_ORDINARY、LOCK_INSERT_INTENTION 四種描述。
LOCK_REC_NOT_GAP
LOCK_GAP
LOCK_ORDINARY(Next-Key Lock)
LOCK_INSERT_INTENTION
static const byte lock_compatibility_matrix[5][5] = { /** IS IX S X AI / / IS / { TRUE, TRUE, TRUE, FALSE, TRUE}, / IX / { TRUE, TRUE, FALSE, FALSE, TRUE}, / S / { TRUE, FALSE, TRUE, FALSE, FALSE}, / X / { FALSE, FALSE, FALSE, FALSE, FALSE}, / AI / { TRUE, TRUE, FALSE, FALSE, FALSE} };
對於GAP型別(鎖物件建立在supremum上或者申請的鎖型別為LOCK_GAP)且申請的不是插入意向鎖時,無需等待任何鎖,這是因為不同Session對於相同GAP可能申請不同型別的鎖,而GAP鎖本身設計為不互相沖突;
LOCK_ORDINARY 或者LOCK_REC_NOT_GAP型別的鎖物件,無需等待LOCK_GAP型別的鎖;
LOCK_GAP型別的鎖無需等待LOCK_REC_NOT_GAP型別的鎖物件;
任何鎖請求都無需等待插入意向鎖。
表級鎖
InnoDB的表級別鎖包含五種鎖模式:LOCK_IS、LOCK_IX、LOCK_X、LOCK_S以及LOCK_AUTO_INC鎖,鎖之間的相容性遵循陣列lock_compatibility_matrix中的定義。
InnoDB表級鎖的目的是為了防止DDL和DML的併發問題。但從5.5版本開始引入MDL鎖後,InnoDB層的表級鎖的意義就沒那麼大了,MDL鎖本身已經覆蓋了其大部分功能。