與其說是博客,不如說是翻譯。
原文地址:dev.mysql.com/doc/refman/…
打不開的朋友能夠在百度網盤下載:連接:pan.baidu.com/s/1V3mMA0QT… 提取碼:zl0u (下載過程真心不容易,拿走的幫忙點個贊)html
共享鎖&排他鎖mysql
意向鎖
意向鎖是表級別鎖,代表事務即將須要獲取的行鎖的級別。sql
意向鎖協議:學習
各類表級別鎖的兼容性圖:spa
若是事務的鎖,與已經存在的鎖兼容,那麼能夠執行,不兼容則阻塞至衝突的鎖釋放爲止。記錄鎖
記錄鎖是鎖住一行索引記錄的。好比SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;阻止其餘事務對t.c1 is 10的記錄進行插入、更新、刪除行操做。
記錄鎖永遠鎖住的是索引記錄,對沒有索引的表,innoDB會建立一個隱藏彙集索引。(非本文重點)翻譯
間隙鎖
間隙鎖是索引記錄之間的間隙的鎖,或者是在第一以前/最後的索引記錄以後上的鎖
對於惟一索引,而且只搜索某一行的狀況下,間隙鎖不存在。例如id爲惟一索引的表中,執行SELECT * FROM child WHERE id = 100; 就沒有間隙鎖。若是id不是索引,或者不是惟一索引,間隙鎖會鎖住記錄以前的間隙。
值得一提的是,不一樣的事務能夠同時擁有同一個間隙上的間隙鎖。 間隙鎖知識爲了防止其餘事務往間隙裏插入,並不在意其餘事務往同一個間隙上加間隙鎖,間隙S鎖與間隙X鎖沒有什麼區別,不衝突,他們的目的都是一致的(即防插入)。code
next-key鎖,是記錄鎖和記錄鎖以前的間隙上的間隙鎖的整合。
對於一個值分別爲10,11,13,20的索引來講,可能的next-key鎖範圍以下:cdn
插入意向鎖
插入意向鎖是插入以前的一種gap鎖。除非插入同一個位置,不然不一樣事務插入同一個間隙不須要等待其餘事務。好比有一個索引,列爲4和7,兩個事務分別想插入5和6,每一個事務都鎖住4和7之間的間隙,可是互相不會阻塞。
下面的例子展現了一個事務先於插入(設置排他鎖)以前設置插入意向鎖的例子。
事務A:
放置一個id > 100的排他鎖,這個排他鎖包括102以前的gap鎖。htm
mysql> CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
mysql> INSERT INTO child (id) values (90),(102);
mysql> START TRANSACTION;
mysql> SELECT * FROM child WHERE id > 100 FOR UPDATE;
+-----+
| id |
+-----+
| 102 |
+-----+
複製代碼
事務B:
在等待獲取排他鎖時,設置一個插入意向鎖。blog
mysql> START TRANSACTION;
mysql> INSERT INTO child (id) VALUES (101);
複製代碼
事務B會被阻塞。
(事務B插入95的話不會阻塞,這說明事務A的排他鎖是真的>100,可是100這條記錄並不存在,有點百思不得其解,等具體分析鎖和sql語句的時候再說吧)
AUTO-INC鎖是表級別鎖,當事務插入包含AUTO-INCREMENT列的表時起做用。最簡單的例子,若是一個事務在往表裏插入數據,其餘事務事務的插入必須等待。
和Spatial Indexes有關,忽略。
其實這麼些概念,是不一樣維度的東西,共享/排他是一個維度,表鎖/行鎖是一個維度,具體再細分又有record lock、gap lock之類。
mysql官方文檔五千多頁,真就終身學習啊?個人天