4.1 行鎖是怎么實現的,為什么?
InnoDB存儲引擎的鎖是通過加在索引上面完成的,如果表沒有創建索引,InnoDB會自動創建一個6字節的自增索引。 因為Innodb是索引組織表,通過索引去找對應的數據行。
4.2MySQL 鎖機制
鎖類型分別為:record-lock, gap鎖, next-key鎖
(1)記錄鎖:在行相應的索引記錄上的鎖
(2)gap鎖:是在索引記錄間歇上的鎖
(3)next-key鎖:是記錄鎖和在此索引記錄之前的gap上的鎖的結合
(4)innodb行鎖的加鎖方式: 當根據innodb表的索引搜索時, 設置共享鎖和排它鎖在索引記錄上
(5)行鎖實際上是索引鎖
(6)innodb_locks_unsafe_for_binlog:
當為0時(disabled), 這個開啟了gap鎖;設置為1,關閉gap鎖(這會導致幻讀,引起主從同步不一致)。
(7)開啟這個選項innodb_locks_unsafe_for_binlog并不關閉gap鎖在外鍵檢查方面的作用
(8)在UPDATE和DELETE時,innodb首先對遇到的每一行加行鎖;如果innodb_locks_unsafe_for_binlog開啟,那么不匹配的行上的鎖將被釋放;如果未開啟,不匹配的行上的鎖也不釋放,直到事務結束
(9)即使innodb表上沒有索引,也會使用內部的clustered index來進行鎖定;
(10)innodb除主鍵的索引之外的其他索引和clustered index在內部是建立一張索引對應表;當利用其他索引掃描記錄時,對其他索引加的鎖最后都轉換為對clustered index加的鎖
(11)在UPDATE模式下,對檢索中遇到的記錄加排它鎖;在INSERT...SELECT模式下,對檢索中遇到的記錄加共享鎖;在INSERT模式下,對檢索中遇到的記錄加排它鎖;在DELETE模式下,對檢索中遇到的記錄加排它鎖
(12)在使用unique index進行搜索,并且只返回一行時,不使用gap鎖
(13)next-key鎖舉例:假設索引包括10,11,13,20,則next-key鎖為:(negative infinity, 10],(10, 11],(11,13],(13, 20],(20, positive infinity)
(14)使用next-key鎖可以預防幻讀
(15)gap鎖在read_committed下或當innodb_locks_unsafe_for_binlog=on時被關閉;當在這種情況下時,不匹配的行上的鎖將被釋放
新聞熱點
疑難解答