mysql 整理之mysql 索引 鎖

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時被關閉;當在這種情況下時,不匹配的行上的鎖將被釋放

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章