成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

InnoDB,select為啥會阻塞insert?

數據庫 MySQL
MySQL的InnoDB的細粒度行鎖,是它最吸引人的特性之一。但是,如《InnoDB,5項最佳實踐》所述,如果查詢沒有命中索引,也將退化為表鎖。InnoDB的細粒度鎖,是實現在索引記錄上的。

InnoDB,select為啥會阻塞insert?

MySQL的InnoDB的細粒度行鎖,是它最吸引人的特性之一。

但是,如《InnoDB,5項***實踐》所述,如果查詢沒有***索引,也將退化為表鎖。

InnoDB的細粒度鎖,是實現在索引記錄上的。 

一、InnoDB的索引

InnoDB的索引有兩類索引,聚集索引(Clustered Index)與普通索引(Secondary Index)。 

InnoDB的每一個表都會有聚集索引:

(1)如果表定義了PK,則PK就是聚集索引;

(2)如果表沒有定義PK,則***個非空unique列是聚集索引;

(3)否則,InnoDB會創建一個隱藏的row-id作為聚集索引;

為了方便說明,后文都將以PK說明。 

索引的結構是B+樹,這里不展開B+樹的細節,說幾個結論:

(1)在索引結構中,非葉子節點存儲key,葉子節點存儲value;

(2)聚集索引,葉子節點存儲行記錄(row);

畫外音:所以,InnoDB索引和記錄是存儲在一起的,而MyISAM的索引和記錄是分開存儲的。

(3)普通索引,葉子節點存儲了PK的值;

畫外音:

所以,InnoDB的普通索引,實際上會掃描兩遍:

***遍,由普通索引找到PK;

第二遍,由PK找到行記錄;

索引結構,InnoDB/MyISAM的索引結構,如果大家感興趣,未來撰文詳述。 

舉個例子,假設有InnoDB表:

 

  1. t(id PK, name KEY, sex, flag);  

表中有四條記錄:

 

  1. 1, shenjian, m, A  
  2. 3, zhangsan, m, A  
  3. 5, lisi, m, A  
  4. 9, wangwu, f, B 

 

以看到:

(1)***幅圖,id PK的聚集索引,葉子存儲了所有的行記錄;

(2)第二幅圖,name上的普通索引,葉子存儲了PK的值; 

對于:

 

  1. select * from t where name=’shenjian’; 

(1)會先在name普通索引上查詢到PK=1;

(2)再在聚集索引衫查詢到(1,shenjian, m, A)的行記錄; 

下文簡單介紹InnoDB七種鎖中的剩下三種:

  1. 記錄鎖(Record Locks)
  2. 間隙鎖(Gap Locks)
  3. 臨鍵鎖(Next-Key Locks)

為了方便講述,如無特殊說明,后文中,默認的事務隔離級別為可重復讀(Repeated Read, RR)。 

二、記錄鎖(Record Locks)

記錄鎖,它封鎖索引記錄,例如:

 

  1. select * from t where id=1 for update 

它會在id=1的索引記錄上加鎖,以阻止其他事務插入,更新,刪除id=1的這一行。 

需要說明的是:

 

  1. select * from t where id=1; 

則是快照讀(SnapShot Read),它并不加鎖,具體在《InnoDB為什么并發高,讀取快?》中做了詳細闡述。 

三、間隙鎖(Gap Locks)

間隙鎖,它封鎖索引記錄中的間隔,或者***條索引記錄之前的范圍,又或者***一條索引記錄之后的范圍。 

依然是上面的例子,InnoDB,RR:

 

  1. t(id PK, name KEY, sex, flag);  

表中有四條記錄:

 

  1. 1, shenjian, m, A  
  2. 3, zhangsan, m, A  
  3. 5, lisi, m, A  
  4. 9, wangwu, f, B  

 

這個SQL語句

 

  1. select * from t  where id between 8 and 15  for update

 

會封鎖區間,以阻止其他事務id=10的記錄插入。

畫外音:

為什么要阻止id=10的記錄插入?

如果能夠插入成功,頭一個事務執行相同的SQL語句,會發現結果集多出了一條記錄,即幻影數據。 

間隙鎖的主要目的,就是為了防止其他事務在間隔中插入數據,以導致“不可重復讀”。 

如果把事務的隔離級別降級為讀提交(Read Committed, RC),間隙鎖則會自動失效。 

四、臨鍵鎖(Next-Key Locks)

臨鍵鎖,是記錄鎖與間隙鎖的組合,它的封鎖范圍,既包含索引記錄,又包含索引區間。 

更具體的,臨鍵鎖會封鎖索引記錄本身,以及索引記錄之前的區間。 

如果一個會話占有了索引記錄R的共享/排他鎖,其他會話不能立刻在R之前的區間插入新的索引記錄。

畫外音:原文是說

If one session has a shared or exclusive lock on record R in an index, another session cannot insert a new index record in the gap immediately before R in the index order. 

依然是上面的例子,InnoDB,RR:

 

  1. t(id PK, name KEY, sex, flag);  

表中有四條記錄:

 

  1. 1, shenjian, m, A  
  2. 3, zhangsan, m, A  
  3. 5, lisi, m, A  
  4. 9, wangwu, f, B  

 

PK上潛在的臨鍵鎖為:

(-infinity, 1]

(1, 3]

(3, 5]

(5, 9]

(9, +infinity] 

臨鍵鎖的主要目的,也是為了避免幻讀(Phantom Read)。如果把事務的隔離級別降級為RC,臨鍵鎖則也會失效。

畫外音:關于事務的隔離級別,以及幻讀,之前的文章一直沒有展開說明,如果大家感興趣,后文詳述。 

今天的內容,主要對InnoDB的索引,以及三種鎖的概念做了介紹。場景與例子,也都是最簡單的場景與最簡單的例子。

InnoDB的鎖,與索引類型,事務的隔離級別相關,更多更復雜更有趣的案例,后續和大家介紹。 

五、總結

(1)InnoDB的索引與行記錄存儲在一起,這一點和MyISAM不一樣;

(2)InnoDB的聚集索引存儲行記錄,普通索引存儲PK,所以普通索引要查詢兩次;

(3)記錄鎖鎖定索引記錄;

(4)間隙鎖鎖定間隔,防止間隔中被其他事務插入;

(5)臨鍵鎖鎖定索引記錄+間隔,防止幻讀; 

責任編輯:龐桂玉 來源: 58沈劍
相關推薦

2018-08-27 07:29:34

InnoDBinsertselect

2023-03-27 08:17:48

2010-09-03 15:27:02

SQLSELECT語句

2018-06-01 16:24:29

數據庫MySQL Innod阻塞事務

2021-07-07 08:01:48

CSS DOM解析

2022-06-27 07:56:36

Mybatis源碼Spring

2020-04-30 10:07:54

數據庫數據遷移Insert into

2010-09-13 10:55:44

SQL Server

2022-02-12 17:48:03

InnoDBMySQL查詢數據

2024-04-10 14:27:03

MySQL數據庫

2024-03-06 08:18:22

語句GreatSQL

2024-05-20 09:58:27

2011-07-22 16:59:30

MySQL數據庫嵌套查詢

2022-03-02 10:11:41

索引場景數據庫

2025-06-16 07:45:00

2010-09-10 11:01:09

sql變量

2021-09-28 15:47:14

豎裝顯卡性能

2020-04-30 11:25:32

Insert into數據庫索引

2021-06-04 18:14:15

阻塞非阻塞tcp

2010-05-18 13:45:08

MySQL selec
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日日操 | av手机在线播放 | 嫩草一区二区三区 | 国产精品美女久久久久久久网站 | 亚洲免费在线 | 精品久久久久久亚洲精品 | 男女羞羞视频在线免费观看 | 色婷婷综合久久久中文字幕 | 久久精品视频免费看 | 国产免费拔擦拔擦8x高清 | 欧美二区在线 | 黄色大片免费观看 | 亚洲婷婷六月天 | 瑟瑟免费视频 | 欧美一区视频 | 国产欧美在线一区 | 亚洲综合第一页 | 自拍在线 | 久久亚洲视频网 | 黄色一级毛片 | 在线中文字幕日韩 | 久久精品国产亚洲一区二区 | 午夜亚洲 | 亚洲国产精品久久人人爱 | av中文字幕网 | 99re| 国产一区二区三区四区五区3d | h视频在线观看免费 | 久久久久久高清 | 免费看淫片 | 日韩激情在线 | 99精品免费视频 | 99精品国产一区二区青青牛奶 | 午夜男人天堂 | 欧美日韩视频在线第一区 | 国产免费一区二区 | 久久综合一区 | 中午字幕在线观看 | 亚洲精品中文字幕在线 | 青青草社区| 在线观看第一页 |