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

mysql中InnoDB事務(wù)隔離的記錄鎖、間隙鎖和臨鍵鎖

 更新時(shí)間:2023年12月02日 15:11:57   作者:Hello-Brand  
mysql中InnoDB默認(rèn)的事務(wù)隔離級(jí)別為可重復(fù)讀(Repeated Read, RR),我們當(dāng)下的所有介紹都是基于這個(gè)隔離級(jí)別為前提的,記錄鎖鎖定索引關(guān)聯(lián)的具體記錄,間隙鎖鎖定間隔,防止間隔中被其他事務(wù)插入,臨鍵鎖鎖定索引記錄+間隔,防止幻讀

InnoDB默認(rèn)的事務(wù)隔離級(jí)別為可重復(fù)讀(Repeated Read, RR),我們當(dāng)下的所有介紹都是基于這個(gè)隔離級(jí)別為前提的。

  • 記錄鎖(Record Locks):鎖定單一行記錄,InnoDB 使用記錄鎖來實(shí)現(xiàn)行級(jí)鎖,這樣允許多個(gè)事務(wù)并發(fā)訪問不同的行。
  • 間隙鎖(Gap Locks):InnoDB 的特性,用于鎖定一個(gè)范圍,但不包括實(shí)際的記錄。這主要用于防止幻讀(Phantom Reads)。
  • 臨鍵鎖(Next-Key Locks):InnoDB 存儲(chǔ)引擎的一種鎖定機(jī)制,在執(zhí)行查詢語句時(shí),根據(jù)查詢條件所鎖定的一個(gè)范圍。這個(gè)范圍中包含有間隙鎖和記錄鎖。它的設(shè)計(jì)目的是為了解決幻讀(Phantom Reads)。

記錄鎖(Record Locks)

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

select * from table where id=5 for update;

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

需要說明的是:

select * from table where id=5;

則是快照讀(SnapShot Read),它并不加鎖,快照讀可以參考作者這篇文章:數(shù)據(jù)庫系列:RR和RC下,快照讀的區(qū)別

間隙鎖(Gap Locks)

間隙鎖,它封鎖索引記錄中的間隔,或者第一條索引記錄之前的范圍,又或者最后一條索引記錄之后的范圍。
延續(xù)上面的那個(gè)例子繼續(xù)演示:

# 表結(jié)構(gòu)
table (Id PK, Name , Company);
# 表中包含四條記錄
5, Gates, Microsoft
7, Bezos, Amazon
11, Jobs, Apple
14, Elison, Oracle

執(zhí)行SQL語句如下:

select * from table
    where id between 7 and 13 
    for update;

這樣的話,會(huì)封鎖數(shù)據(jù)的區(qū)間,以防止其他事務(wù)插入id=8的記錄。
假設(shè)沒有間隙鎖,則可能夠插入成功,而之前的select事務(wù),會(huì)發(fā)現(xiàn)檢索的結(jié)果集莫名多了一條記錄,即幻影數(shù)據(jù)。
所以間隙鎖主要目的用于防止幻讀(Phantom Reads),避免其他事務(wù)在間隔中插入數(shù)據(jù),導(dǎo)致 『不可重復(fù)讀』。
如果把事務(wù)的隔離級(jí)別降級(jí)為讀提交(Read Committed, RC),對(duì),就是互聯(lián)網(wǎng)最常用的隔離級(jí)別,間隙鎖則會(huì)自動(dòng)失效。

臨鍵鎖(Next-Key Locks)

臨鍵鎖(Next-Key Locks)是數(shù)據(jù)庫管理系統(tǒng)InnoDB中的一種重要鎖定機(jī)制。這種鎖是查詢時(shí)根據(jù)查詢條件鎖定的一個(gè)范圍,這個(gè)范圍包括間隙鎖和記錄鎖,左開右閉,即不鎖住左邊界,但會(huì)鎖住右邊界。臨鍵鎖的主要設(shè)計(jì)目的是為了解決所謂的“幻讀”問題。

# 左開右閉 示例
(-infinity, 1]
(1, 7]
(7, 9]
(9, +infinity]

依然沿用上面的例子,InnoDB引擎,RR隔離級(jí)別:

-- 創(chuàng)建一個(gè)示例表  
CREATE TABLE users (  
    Id INT PRIMARY KEY,  
    Name VARCHAR(255) NOT NULL,  
    Company VARCHAR(255) NOT NULL,  
);  
  
-- 插入一些示例數(shù)據(jù)  
INSERT INTO users (id, name, company) VALUES (1, 'Alice', 'ali');
INSERT INTO users (id, name, company) VALUES (2, 'Brand', 'tencent');
INSERT INTO users (id, name, company) VALUES (3, 'Charlie', 'baidu');
  
-- 開始一個(gè)事務(wù),并使用臨鍵鎖查詢數(shù)據(jù)  
START TRANSACTION;  
SELECT * FROM users WHERE id > 1 FOR UPDATE;  
  
-- 在另一個(gè)事務(wù)中嘗試插入新數(shù)據(jù),將會(huì)被阻塞直到第一個(gè)事務(wù)釋放鎖 
START TRANSACTION;  
INSERT INTO users (id, name, age) VALUES (4, 'David', 30);  
COMMIT;  
  
-- 第一個(gè)事務(wù)提交后,第二個(gè)事務(wù)可以繼續(xù)執(zhí)行插入操作  
COMMIT;

臨鍵鎖的主要目的,也是為了避免幻讀(Phantom Read),在事務(wù)隔離級(jí)別為可重復(fù)讀的情況下,InnoDB存儲(chǔ)引擎默認(rèn)使用臨鍵鎖。這種鎖提供了一種有效的機(jī)制來保證在并發(fā)環(huán)境中數(shù)據(jù)的完整性和一致性。
如果把事務(wù)的隔離級(jí)別降級(jí)為RC,臨鍵鎖則也會(huì)失效。

總結(jié)

  • InnoDB的索引與行記錄存儲(chǔ)在一起,MyISAM則是通過索引的地址查找到對(duì)應(yīng)的數(shù)據(jù)記錄,效率低一些
  • InnoDB的聚集索引存儲(chǔ)行記錄,普通索引存儲(chǔ)PK,所以普通索引要查詢兩次
  • 記錄鎖鎖定索引關(guān)聯(lián)的具體記錄
  • 間隙鎖鎖定間隔,防止間隔中被其他事務(wù)插入
  • 臨鍵鎖鎖定索引記錄+間隔,防止幻讀
  • select...for update加鎖的幾種情況:
    • 主鍵字段:加行鎖。
    • 唯一索引字段:加行鎖。
    • 普通索引字段:加行鎖。
    • 主鍵范圍:加多個(gè)行鎖。
    • 普通字段:加表鎖。
    • 查詢空數(shù)據(jù):不加鎖。
  • 行鎖與表鎖的區(qū)別
    • 如果事務(wù)1加了行鎖,一直未釋放鎖,事務(wù)2操作相同記錄,會(huì)一直等待直至超時(shí)。
    • 如果事務(wù)1加了表鎖,一直未釋放鎖,事務(wù)2無論操作哪一行記錄,都會(huì)一直等待直到超時(shí)

到此這篇關(guān)于mysql中InnoDB事務(wù)隔離的記錄鎖、間隙鎖和臨鍵鎖的文章就介紹到這了,更多相關(guān)InnoDB的記錄鎖、間隙鎖和臨鍵鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解析mysql中max_connections與max_user_connections的區(qū)別

    解析mysql中max_connections與max_user_connections的區(qū)別

    本篇文章是對(duì)mysql中max_connections與max_user_connections的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • mysql中將null值轉(zhuǎn)換為0的語句

    mysql中將null值轉(zhuǎn)換為0的語句

    mysql中將null值轉(zhuǎn)換為0的語句,在mysql數(shù)據(jù)庫開發(fā)中,如果后期添加了字段那么這些值為空值null,我們?cè)谑褂谜咝枰獙ull轉(zhuǎn)換為0方便后期的控制就需要下面的代碼了。
    2011-02-02
  • Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟

    Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟

    這篇文章主要介紹了Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟,包括創(chuàng)建文件夾、編寫腳本、設(shè)置定時(shí)任務(wù)和測(cè)試腳本,詳細(xì)步驟涵蓋從文件夾創(chuàng)建到腳本執(zhí)行的全過程,幫助用戶實(shí)現(xiàn)數(shù)據(jù)庫的自動(dòng)備份,需要的朋友可以參考下
    2024-11-11
  • MySQL數(shù)據(jù)庫多表操作通關(guān)指南(外鍵約束和多表聯(lián)合查詢)

    MySQL數(shù)據(jù)庫多表操作通關(guān)指南(外鍵約束和多表聯(lián)合查詢)

    看再多的資料不如自己親自動(dòng)手實(shí)戰(zhàn),往往實(shí)戰(zhàn)才能滲透知識(shí),下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫多表操作的相關(guān)資料,包含外鍵約束和多表聯(lián)合查詢等,需要的朋友可以參考下
    2022-06-06
  • MySQL存儲(chǔ)時(shí)間類型選擇的問題講解

    MySQL存儲(chǔ)時(shí)間類型選擇的問題講解

    今天小編就為大家分享一篇關(guān)于MySQL存儲(chǔ)時(shí)間類型選擇的問題講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • MySQL8 排名窗口函數(shù)實(shí)戰(zhàn)

    MySQL8 排名窗口函數(shù)實(shí)戰(zhàn)

    本文闡明SQL三個(gè)排名函數(shù)處理并列名次時(shí)的區(qū)別,包括RANK()跳躍,DENSE_RANK()連續(xù),ROW_NUMBER()分配唯一序號(hào),下面就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2026-02-02
  • mysql 超大數(shù)據(jù)/表管理技巧

    mysql 超大數(shù)據(jù)/表管理技巧

    在實(shí)際應(yīng)用中經(jīng)過存儲(chǔ)、優(yōu)化可以做到在超過9千萬數(shù)據(jù)中的查詢響應(yīng)速度控制在1到20毫秒??瓷先ナ莻€(gè)不錯(cuò)的成績,不過優(yōu)化這條路沒有終點(diǎn),當(dāng)我們的系統(tǒng)有超過幾百人、上千人同時(shí)使用時(shí),仍然會(huì)顯的力不從心
    2013-03-03
  • MySQL如何判斷字符串為NULL或者為空字符串

    MySQL如何判斷字符串為NULL或者為空字符串

    這篇文章主要介紹了MySQL如何判斷字符串為NULL或者為空字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL左聯(lián)多表查詢where條件寫法示例

    MySQL左聯(lián)多表查詢where條件寫法示例

    這篇文章主要介紹了MySQL左聯(lián)多表查詢where條件寫法示例,本文直接給出寫法示例,需要的朋友可以參考下
    2015-02-02
  • mySQL 8.0.33安裝指南(推薦)

    mySQL 8.0.33安裝指南(推薦)

    本文提供MySQL8.0.33的詳細(xì)安裝步驟,從解壓安裝包到設(shè)置系統(tǒng)服務(wù)、配置遠(yuǎn)程訪問及安全設(shè)置等,包括創(chuàng)建和配置MySQL用戶,設(shè)置環(huán)境變量,初始化數(shù)據(jù)庫等關(guān)鍵操作,同時(shí)強(qiáng)調(diào)安全性的重要性,如設(shè)置強(qiáng)密碼、限制遠(yuǎn)程訪問權(quán)限,并建議在重要操作前進(jìn)行數(shù)據(jù)庫備份
    2024-10-10

最新評(píng)論

上林县| 丘北县| 温宿县| 西乡县| 武川县| 奉节县| 梓潼县| 东乌| 阿拉尔市| 彰武县| 界首市| 松溪县| 阳信县| 青浦区| 浠水县| 信丰县| 巴彦县| 固阳县| 筠连县| 莆田市| 玛纳斯县| 襄汾县| 宜良县| 水城县| 泰安市| 呼伦贝尔市| 右玉县| 洛扎县| 襄樊市| 司法| 绵阳市| 晋城| 鄄城县| 罗平县| 临猗县| 民权县| 旬阳县| 安泽县| 宁津县| 土默特左旗| 海原县|