最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql間隙鎖的具體使用

 更新時間:2024年02月04日 11:51:09   作者:好大的月亮  
MySQL中有多種鎖類型,本文主要介紹了mysql間隙鎖的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

概述

通常用的mysql都是innodb引擎;
一般在update的時候用id都會認(rèn)為是給行記錄加鎖;

在使用非唯一索引更新時,會遇到臨鍵鎖(范圍鎖);
臨鍵鎖和表中的數(shù)據(jù)有關(guān);

mysq版本:8隔離級別RR可重復(fù)讀

mysql的lockMode

查看鎖的活動信息

-- 當(dāng)前活動的鎖信息
SELECT * FROM performance_schema.data_locks;
  • X,REC_NOT_GAPX代表排他鎖REC_NOT_GAP代表行鎖。綜合起來就是對這條數(shù)據(jù)(索引項)添加了行級排他鎖;
  • IX:意向排它鎖。上述案例中,給表添加了一個意向排它鎖。當(dāng)其他事務(wù)要對全表的數(shù)據(jù)進(jìn)行加鎖時,那么就不需要判斷每一條數(shù)據(jù)是否被加鎖了。
  • X,GAP:X代表排他鎖;GAP代表間隙鎖(前開后開,即當(dāng)前的lock_data中的索引值對應(yīng)的id最近的上一個id值之間的空隙被鎖定了)
  • supremum pseudo-record: 是 InnoDB 中定義的一種特殊記錄,我們可以理解為 +∞

X,GAP demo說明

假設(shè)表中的數(shù)據(jù)如下,age有普通BTree索引,然后事務(wù)1更新其中age為24的數(shù)據(jù);
可以看到age=24對應(yīng)的id=3加上了X排它鎖,id=3的加上了行級排它鎖;然后對age=24后面的age索引加了一個排他間隙鎖,鎖住了id范圍為(3,5)時間的間隙;

綜上獲得了id范圍為[3,5)之間的鎖

-- 事務(wù)1操作
UPDATE user SET name = 'Vladimir' WHERE age = 24;

在這里插入圖片描述

在這里插入圖片描述

臨鍵鎖

假設(shè)有如下表;且表中數(shù)據(jù)如下;

-- 表結(jié)構(gòu)如下
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`)
) ENGINE=InnoDB COMMENT='用戶表';

撈點網(wǎng)圖,間隙鎖可以看做一個左開右閉的區(qū)間

在這里插入圖片描述

那么在事務(wù)A執(zhí)行sql;
select查詢,查詢到age=24的記錄,然后繼續(xù)向后查詢,發(fā)現(xiàn)后一條是age=32,age不等于24,向后查詢結(jié)束,所以在獲取間隙鎖(24,32],同時當(dāng)前age=24的記錄會加上排它鎖;

然后再向前查詢前一條記錄是age=10,不等于24,向前查詢結(jié)束,然后會獲取(10,24]的間隙鎖;

綜上所述,INNDB加鎖首先定位到等于或者第一個大于目標(biāo)值的葉子節(jié)點

事務(wù)A

-- 根據(jù)非唯一索引列 UPDATE 某條記錄
UPDATE user SET name = 'Vladimir' WHERE age = 24;
-- 或根據(jù)非唯一索引列 鎖住某條記錄
SELECT * FROM user WHERE age = 24 FOR UPDATE;

事務(wù)B中執(zhí)行sql;會遇到間隙鎖,會阻塞

INSERT INTO user VALUES(100, 'Ezreal', 30);

試驗結(jié)果如下

在這里插入圖片描述

在這里插入圖片描述

-- 當(dāng)前活動的鎖信息
SELECT * FROM performance_schema.data_locks;

在這里插入圖片描述

 案例

案例一:間隙鎖簡單案例

步驟事務(wù)A事務(wù)B
1begin;
select * from t where id = 11 for update;
-
2-insert into user value(12,12,12)
3commit;-

當(dāng)有如下事務(wù)A和事務(wù)B時,事務(wù)A會對數(shù)據(jù)庫表增加(10,15]這個區(qū)間鎖,這時insert id = 12 的數(shù)據(jù)的時候就會因為區(qū)間鎖(10,15]而被鎖住無法執(zhí)行。

案例二: 間隙鎖死鎖問題

步驟事務(wù)A事務(wù)B
1begin;
select * from t where id = 9 for update;
-
2-begin;
select * from t where id = 6 for update;
3-insert into user value(7,7,7)
4insert into user value(7,7,7)
-

不同于寫鎖相互之間是互斥的原則,間隙鎖之間不是互斥的,如果一個事務(wù)A獲取到了(5,10]之間的間隙鎖,另一個事務(wù)B也可以獲取到(5,10]之間的間隙鎖。這時就可能會發(fā)生死鎖問題,如下案例。
事務(wù)A獲取到(5,10]之間的間隙鎖不允許其他的DDL操作,在事務(wù)提交,間隙鎖釋放之前,事務(wù)B也獲取到了間隙鎖(5,10],這時兩個事務(wù)就處于死鎖狀態(tài)

案例三: 等值查詢—唯一索引

步驟事務(wù)A事務(wù)B事務(wù)C
1begin;
update u set d= d+ 1 where id = 7;
--
2-insert into u (8,8,8);
-
4--update set d = d+ 1 where id = 10

1.加鎖的范圍是(5,10]的范圍鎖
2.由于數(shù)據(jù)是等值查詢,并且表中最后數(shù)據(jù)id = 10 不滿足id= 7的查詢要求,故id=10 的行級鎖退化為間隙鎖,(5,10)
3.所以事務(wù)B中id=8會被鎖住,而id=10的時候不會被鎖住

案例四: 等值查詢—普通索引

步驟事務(wù)A事務(wù)B事務(wù)C
1begin;
select id form t where c = 5 lock in share mode;
--
2-update t set d = d + 1 where id = 5-
4--insert into values (7,7,7)

1.加鎖的范圍是(0,5],(5,10]的范圍鎖
2.由于c是普通索引,根據(jù)原則4,搜索到5后繼續(xù)向后遍歷直到搜索到10才放棄,故加鎖范圍為(5,10]
3.由于查詢是等值查詢,并且最后一個值不滿足查詢要求,故間隙鎖退化為(5,10)
4.因為加鎖是對普通索引c加鎖,而且因為索引覆蓋,沒有對主鍵進(jìn)行加鎖,所以事務(wù)B執(zhí)行正常
5.因為加鎖范圍(5,10)故事務(wù)C執(zhí)行阻塞
6.需要注意的是,lock in share mode 因為覆蓋索引故沒有鎖主鍵索引,如果使用for update 程序會覺得之后會執(zhí)行更新操作故會將主鍵索引一同鎖住

案例五: 范圍查詢—唯一索引

步驟事務(wù)A事務(wù)B事務(wù)C
1begin;
select * form t where id >= 10 and id <11 for update
--
2-insert into values(8,8,8)
insert into values(13,13,13) 
-
4--update t set d = d+ 1 where id = 15 
  • next-key lock 增加范圍鎖(5,10]
  • 根據(jù)原則5,唯一索引的范圍查詢會到第一個不符合的值位置,故增加(10,15]
    3.因為等值查詢有id =10 根據(jù)原則3間隙鎖升級為行鎖,故剩余鎖[10,15]
    4.因為查詢并不是等值查詢,故[10,15]不會退化成[10,15)
    5.故事務(wù)B(13,13,13)阻塞,事務(wù)C阻塞

案例六: 范圍查詢—普通索引

步驟事務(wù)A事務(wù)B事務(wù)C
1begin;
select * form t where c >= 10 and c <11 for update
--
2-insert into values(8,8,8)
-
4--update t set d = d+ 1 where c = 15 
  • next-key lock 增加范圍鎖(5,10],(10,15]
    2.因為c是非唯一索引,故(5,10]不會退化為10
    3.因為查詢并不是等值查詢,故[10,15]不會退化成[10,15)
    4.所以事務(wù)B和事務(wù)C全部堵塞

案例八: 普通索引-等值問題

上面的數(shù)據(jù)增加一行(30,10,30),這樣在數(shù)據(jù)庫中存在的c=10的就有兩條記錄

步驟事務(wù)A事務(wù)B事務(wù)C
1begin;
delete from t where c = 10
--
2-insert into values(12,12,12)
-
4--update t set d = d+ 1 where c = 15 
  • next-key lock 增加范圍鎖(5,10],(10,15]
    2.因為是等值查詢故退化為(5,10],(10,15),故事務(wù)B阻塞,事務(wù)C執(zhí)行成功
    加鎖的范圍如下圖

案例九: 普通索引-等值Limit問題

步驟事務(wù)A事務(wù)B事務(wù)C
1begin;
delete from t where c = 10 limit 2
--
2-insert into values(12,12,12)
-
4--update t set d = d+ 1 where c = 15 

1.根據(jù)上面案例8改造,將delete增加limit操作2的操作
2.因為知道了數(shù)據(jù)加鎖值加2條,故在加鎖(5,10]之后發(fā)現(xiàn)已經(jīng)有兩條數(shù)據(jù),故后面不在向后匹配加鎖。所以事務(wù)B執(zhí)行成功,加鎖范圍如下

 到此這篇關(guān)于mysql間隙鎖的具體使用的文章就介紹到這了,更多相關(guān)mysql間隙鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL的日志基礎(chǔ)知識及基本操作學(xué)習(xí)教程

    MySQL的日志基礎(chǔ)知識及基本操作學(xué)習(xí)教程

    這篇文章主要介紹了MySQL的日志基礎(chǔ)知識學(xué)習(xí)教程,包括MySQL中日志相關(guān)常用的服務(wù)器變量說明,極力推薦!需要的朋友可以參考下
    2015-11-11
  • mysql 5.7.21 解壓版通過歷史data目錄恢復(fù)數(shù)據(jù)的教程圖解

    mysql 5.7.21 解壓版通過歷史data目錄恢復(fù)數(shù)據(jù)的教程圖解

    本文通過圖文并茂的形式給大家介紹了mysql 5.7.21 解壓版,通過歷史data目錄恢復(fù)數(shù)據(jù)的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • Mysql中的sql優(yōu)化實踐詳解

    Mysql中的sql優(yōu)化實踐詳解

    這篇文章主要介紹了Mysql中的sql優(yōu)化實踐詳解,SQL優(yōu)化是指通過改進(jìn)SQL語句的編寫和查詢計劃的設(shè)計來提高數(shù)據(jù)庫查詢性能的過程,在優(yōu)化SQL時,可以采取一些措施來提升查詢性能,需要的朋友可以參考下
    2023-09-09
  • MySQL5.7.24版本的數(shù)據(jù)庫安裝過程圖文詳解

    MySQL5.7.24版本的數(shù)據(jù)庫安裝過程圖文詳解

    這篇文章主要介紹了MySQL5.7.24版本的數(shù)據(jù)庫安裝過程,需要的朋友可以參考下
    2018-11-11
  • 數(shù)據(jù)從MySQL遷移到Oracle 需要注意什么

    數(shù)據(jù)從MySQL遷移到Oracle 需要注意什么

    將數(shù)據(jù)從MySQL遷移到Oracle,大家需要注意什么?Oracle移植到mysql,又需要注意什么?如何有效解決移植過程的問題,為了數(shù)據(jù)庫的兼容性我們又該注意些什么?感興趣的小伙伴們可以參考一下
    2016-11-11
  • MySQL通過binlog恢復(fù)數(shù)據(jù)

    MySQL通過binlog恢復(fù)數(shù)據(jù)

    通過了解binlog日志的相關(guān)配置,簡單掌握通過binlog對數(shù)據(jù)庫進(jìn)行數(shù)據(jù)恢復(fù)操作。有此需求的朋友可以參考下
    2021-05-05
  • Oracle到MySQL數(shù)據(jù)庫遷移的兼容性問題處理辦法

    Oracle到MySQL數(shù)據(jù)庫遷移的兼容性問題處理辦法

    數(shù)據(jù)遷移是在數(shù)據(jù)庫管理系統(tǒng)之間轉(zhuǎn)換數(shù)據(jù)的過程,這個過程可能涉及到不同類型的數(shù)據(jù)庫系統(tǒng),例如從Oracle數(shù)據(jù)庫遷移到MySQL數(shù)據(jù)庫,這篇文章主要介紹了Oracle到MySQL數(shù)據(jù)庫遷移的兼容性問題處理辦法,需要的朋友可以參考下
    2026-05-05
  • MySQL安全快速的刪除一張大表的正確方式

    MySQL安全快速的刪除一張大表的正確方式

    生產(chǎn)環(huán)境中直接 DROP TABLE 一張千萬級大表無異于自 殺,本文深度解析 InnoDB 刪表的底層原理,提供一套無感刪表的標(biāo)準(zhǔn)操作流程(SOP),助你在不影響業(yè)務(wù)的前提下,安全、快速地清理海量數(shù)據(jù),需要的朋友可以參考下
    2026-03-03
  • 分享MySql8.0.19 安裝采坑記錄

    分享MySql8.0.19 安裝采坑記錄

    這篇文章主要介紹了MySql8.0.19 安裝采坑記錄,內(nèi)容雖然不長,但是都是朋友經(jīng)常遇到的問題,小編特此分享到腳本之家平臺,需要的朋友可以參考下
    2020-02-02
  • mysql 5.7.19 winx64免安裝版配置教程

    mysql 5.7.19 winx64免安裝版配置教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.19 winx64免安裝版配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論

夹江县| 天祝| 宿松县| 酒泉市| 土默特右旗| 甘洛县| 米脂县| 怀宁县| 兴隆县| 喀喇| 石林| 海晏县| 天气| 榆社县| 盘山县| 古田县| 泸州市| 定结县| 碌曲县| 开阳县| 彝良县| 博兴县| 沾化县| 甘孜| 晋宁县| 吉首市| 乌兰县| 红河县| 巧家县| 东海县| 读书| 京山县| 临泉县| 甘泉县| 凉城县| 梅州市| 建瓯市| 河东区| 霞浦县| 新丰县| 晋江市|