一個Next-key鎖結合了行鎖和gap鎖。
InnoDB執行一個行級別鎖在這樣的一個途徑,那就是它搜索或者掃描一個表索引時,它設置共享或者獨占鎖在它遭遇的索引記錄上。於是,行級鎖是真實的行記錄鎖。一個next-key鎖在一個行記錄上總是這個行記錄前的間隙。這就是一個next-key是一個索引記錄鎖加上一個在這個記錄前的間隙鎖。如果一個會話有一個共享鎖或者一個獨占鎖在一個索引的記錄R上,另外的會話不能插入一個新索引記錄在R前的間隙。
猜測一個索引包含10,11,13,20。可能這個索引的next-key鎖蓋以下間隔,這個間隔在一個圓括號表示的排除節點符號和一個方括號表示包含節點符號。
看這個最后的間隔,next-key鎖鎖定在索引中上面的最大值和一個“臨界值”偽記錄,這個偽記錄有一個比任何實際值都高的值,這個偽記錄不是真實的記錄,因此,在這個影響下,這個next-key鎖僅僅鎖了跟隨在最大索引值的間隙。
默認情況下,InnoDB操作在可重復度事務隔離級別,在這個案例,InnoDB使用next-key為查找和索引掃描鎖定,防止phantom(幻影)行的出現。
事務數據為一個next-key鎖展現到跟隨在下面語句的輸出: