一、mysql 非少數索引的等值查詢為什么要加gap鎖
mysql 中非少數索引使用的也是 B+ 樹來組織數據結構。
假設 id 的索引結構在葉子節點從左到右的排列順序是 1 1 2 2 4 5,如果我們只使用 記錄鎖來鎖住索引 2,因為索引中有兩個 2,所以這兩個 2 都會被加上一個記錄鎖。
現在假設有另外一個事務,它執行
insert into table? values(2);
也就是說,另外一個事務需要添加一條記錄,并且 id=2,因為上面我們針對 兩個 2 加的是兩個記錄鎖,所以這個事務可以去執行。
為了避免幻讀,此時要使用記錄鎖鎖住兩個 2 的主鍵索引,另外兩個 2 的非少數索引也必須鎖住,然后再鎖住三個區間。
我們使用案例驗證下這些鎖:
create table test.testtable
(
??? id??? bigint auto_increment primary key,
??? age int(20)???? null
);
create index age_index on test.testtable (age);
insert into testtable? values(1,1);
insert into testtable? values(3,1);
insert into testtable? values(5,2);
insert into testtable? values(7,2);
insert into testtable? values(9,4);
insert into testtable? values(13,5);
begin;
select * from testtable where age = 2 for update;
名列前茅個是 意向排他鎖,這個不分析了。
第二個和第三個是 next-key 鎖,鎖住的是(1,2] 和 (2,2]。
第四個和第五個是記錄鎖,鎖住兩個 2 的主鍵索引。
第六個是間隙鎖,鎖?。?,4)區間。
延伸閱讀:
二、字符集(Character set)是什么
是多個字符(英文字符,漢字字符,或者其他國家語言字符)的集合,字符集種類較多,每個字符集包含的字符個數不同。
特點:
①字符編碼方式是用一個或多個字節表示字符集中的一個字符
②每種字符集都有自己特有的編碼方式,因此同一個字符,在不同字符集的編碼方式下,會產生不同的二進制
常見字符集:
ASCII字符集:基于羅馬字母表的一套字符集,它采用1個字節的低7位表示字符,高位始終為0。
LATIN1字符集:相對于ASCII字符集做了擴展,仍然使用一個字節表示字符,但啟用了高位,擴展了字符集的表示范圍。
GBK字符集:支持中文,字符有一字節編碼和兩字節編碼方式。
UTF8字符集:Unicode字符集的一種,是計算機科學領域里的一項業界標準,支持了所有國家的文字字符,utf8采用1-4個字節表示字符。