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

什么是插入意向鎖?你知道了嗎?

開發 前端
按照我們之前學習的關于 Gap Lock 的知識分析一下,此時間隙鎖的范圍是 (89,99),意思是這個范圍的 age 都不可以插入。

?1. 為什么需要插入意向鎖

我們之前已經有 Gap Lock 了,Gap Lock 可以幫我們在一定程度上解決幻讀問題,但是,之前的似乎有點問題。

假設我有如下一張表:

CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

id 是主鍵自增;age 是一個普通索引,現在表中有如下數據:

圖片

假設我想執行如下的插入 SQL:

begin;
insert into user(username,age) values('wangwu',95);

注意,這個 SQL 執行了但是事務還沒有提交。

按照我們之前學習的關于 Gap Lock 的知識分析一下,此時間隙鎖的范圍是 (89,99),意思是這個范圍的 age 都不可以插入。

如果是這樣的話,小伙伴們會發現數據插入的效率可就太低了,很容易發生鎖沖突,那么怎么辦?

我們今天要介紹的插入意向鎖就是用來解決這個問題的。

2. 什么是插入意向鎖

我們來看看 MySQL 官網的介紹:

An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap. Suppose that there are index records with values of 4 and 7. Separate transactions that attempt to insert values of 5 and 6, respectively, each lock the gap between 4 and 7 with insert intention locks prior to obtaining the exclusive lock on the inserted row, but do not block each other because the rows are nonconflicting.

大致翻譯下一下就是這樣:

插入意向鎖是一種在 INSERT 操作之前設置的一種間隙鎖,插入意向鎖表示了一種插入意圖,即當多個不同的事務,同時往同一個索引的同一個間隙中插入數據的時候,它們互相之間無需等待,即不會阻塞(要是單純按照之前間隙鎖的理論,必須要等一個間隙鎖釋放了,下一個事務才可以往相同的間隙處插入數據)。假設有值為 4 和 7 的索引記錄,現在有兩個事務,分別嘗試插入值為 5 和 6 的記錄,在獲得插入行的排他鎖之前,每個事務使用插入意向鎖鎖定 4 和 7 之間的間隙,但是這兩個事務不會相互阻塞,因為行是不沖突的。

這就是插入意向鎖。

3. 實踐

小伙伴們注意,松哥之前和大家聊 Gap Lock,說過這個是可重復讀(REPEATABLE READ)這個隔離級別下特有的產物,那么現在 Insert Intention Lock 是一種特殊的 Gap Lock,當然也是在可重復讀這個隔離級別下生效。

接下來我們通過兩個個簡單的案例來演示一下插入意向鎖。

3.1 案例一

我們的表結構以及數據和第一小節一致。

首先我們在會話 A 中,執行如下代碼:

圖片

現在會話 A 中的事務沒有提交。

接下來我們在會話 B 中,也執行一個插入操作:

圖片

我們發現會話 B 也可以正常執行,沒有發生阻塞。

這說明,兩個插入意向鎖之間是兼容的,可以共存的。

3.2 案例二

我們再來看一個不兼容的例子。

首先在會話 A 中執行如下 SQL 查詢 age 大于 80 的記錄,并添加排他鎖:

圖片

接下來在會話 B 中,執行如下代碼插入一行數據:

圖片

小伙伴們看到,這個操作會被阻塞!阻塞的原因在于,插入意向鎖和排他鎖之間是互斥的。

趁著發生阻塞的這會,在會話 C 中,我們通過在前面文章中所使用的 show engine innodb status\G 指令,來查看下加鎖的情況,重點看 TRANSACTION 節點:

圖片

在輸出的內容中,紅色框選中的地方,清楚的表明了插入意向鎖的存在。

4. 小結

總結一下:

插入意向鎖雖然名字中有意向二字,但實際上是一個特殊的間隙鎖。

插入意向鎖之間不互斥。

插入意向鎖和排他鎖之間互斥。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2023-07-03 08:15:46

MySQLInnoDB

2024-05-15 09:23:45

MySQL排他鎖共享鎖

2025-01-15 00:00:00

存儲整數集Roaring

2022-10-31 10:03:03

2023-12-28 17:33:25

意向鎖MySQL開發者

2024-10-30 10:38:08

2022-04-21 10:39:29

InnoDB意向鎖SQL

2021-07-29 07:55:20

JavaScriptcatchthrow

2023-10-28 09:00:03

進程系統服務

2016-09-27 19:53:25

IOS 10蘋果

2022-02-21 09:00:08

數字簽名驗證

2025-06-04 02:55:00

MySQL意向鎖記錄鎖

2022-08-16 07:32:03

RestfulSOAPRPC

2018-05-20 11:01:47

Siri語音助手手機

2022-04-01 08:48:45

JavaPythonRuby

2024-10-30 08:31:36

Next.js高效性能

2022-07-01 13:38:48

霧計算邊緣計算

2023-05-26 14:07:00

數據庫分布式RAC

2019-06-05 15:20:00

MongoDBNoSQL數據庫

2023-04-07 00:05:30

WebGPUAPIJavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区在线观看视频 | 久久中文字幕av | 国户精品久久久久久久久久久不卡 | 精品国产乱码久久久久久老虎 | 在线2区 | 成人精品国产 | 日韩精品一区二区三区视频播放 | 久久91 | 一区二区三区在线电影 | 91在线精品一区二区 | 久久国产精品亚洲 | 午夜成人免费视频 | 国产三区视频在线观看 | 婷婷一级片 | 国产成人av一区二区三区 | 午夜亚洲 | 日韩中文字幕 | 国产一级片在线观看视频 | 男人天堂av网 | 欧美一区二区在线播放 | 国产成人免费网站 | 国产精品成人一区二区 | 久久1区 | 国产日韩av一区二区 | 欧美精品一区二区三区四区五区 | 成年人在线观看 | 亚洲一区二区在线视频 | 色免费视频 | 色99视频 | 免费亚洲一区二区 | 亚洲a人| 中文字幕乱码视频32 | 久久精品国产久精国产 | 91麻豆精品一区二区三区 | 免费人成在线观看网站 | 中文字幕精品一区久久久久 | 中文字幕精品一区久久久久 | 日韩一二三 | 国产蜜臀| 国产 日韩 欧美 在线 | 成人免费在线电影 |