亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

InnoDB默認的事務隔離級別為可重復讀(Repeated Read, RR),我們當下的所有介紹都是基于這個隔離級別為前提的。

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

記錄鎖(Record Locks)

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

select * from table where id=5 for update;

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

需要說明的是:

select * from table where id=5;

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

間隙鎖(Gap Locks)

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

# 表結構
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;

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

臨鍵鎖(Next-Key Locks)

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

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

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

-- 創(chuàng)建一個示例表  
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');
  
-- 開始一個事務,并使用臨鍵鎖查詢數(shù)據(jù)  
START TRANSACTION;  
SELECT * FROM users WHERE id > 1 FOR UPDATE;  
  
-- 在另一個事務中嘗試插入新數(shù)據(jù),將會被阻塞直到第一個事務釋放鎖 
START TRANSACTION;  
INSERT INTO users (id, name, age) VALUES (4, 'David', 30);  
COMMIT;  
  
-- 第一個事務提交后,第二個事務可以繼續(xù)執(zhí)行插入操作  
COMMIT;

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

總結

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

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

相關文章

  • MySQL5.7.18修改密碼的方法

    MySQL5.7.18修改密碼的方法

    這篇文章主要介紹了MySQL5.7.18修改密碼的方法,非常不錯,具有參考解決價值,需要的朋友可以參考下
    2017-05-05
  • CentOS 6.5下yum安裝 MySQL-5.5全過程圖文教程

    CentOS 6.5下yum安裝 MySQL-5.5全過程圖文教程

    在linux安裝mysql是一個困難的事情,yum安裝一般是安裝的mysql5.1,現(xiàn)在經過自己不懈努力終于能用yum安裝mysql5.5了。下面通過兩種方法給大家介紹CentOS 6.5下yum安裝 MySQL-5.5全過程,一起學習吧
    2016-05-05
  • MySQL8.0 Undo Tablespace管理詳解

    MySQL8.0 Undo Tablespace管理詳解

    本文主要介紹了MySQL8.0 Undo Tablespace管理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • MySQL關聯(lián)查詢優(yōu)化實現(xiàn)方法詳解

    MySQL關聯(lián)查詢優(yōu)化實現(xiàn)方法詳解

    在數(shù)據(jù)庫的設計中, 我們通常都是會有很多張表 , 通過表與表之間的關系建立我們想要的數(shù)據(jù)關系, 所以在多張表的前提下, 多表的關聯(lián)查詢就尤為重要,這篇文章主要介紹了MySQL關聯(lián)查詢優(yōu)化
    2022-11-11
  • 在MySQL中按字符串中的數(shù)字排序的詳細教程

    在MySQL中按字符串中的數(shù)字排序的詳細教程

    本文將詳細介紹如何在MySQL中利用正則表達式提取字符串中的數(shù)字并按這些數(shù)字進行排序,以一個具體的例子來說明,使得即使是數(shù)據(jù)庫操作的初學者也能輕松理解和應用,需要的朋友可以參考下
    2024-07-07
  • mysql中數(shù)據(jù)統(tǒng)計的技巧備忘錄

    mysql中數(shù)據(jù)統(tǒng)計的技巧備忘錄

    mysql是常用數(shù)據(jù)庫,對于數(shù)字操作相關的東西相當方便,這篇文章主要給大家介紹了關于mysql中數(shù)據(jù)統(tǒng)計技巧的相關資料,非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • MySQL出現(xiàn)莫名其妙的斷開連接以及解決方案

    MySQL出現(xiàn)莫名其妙的斷開連接以及解決方案

    這篇文章主要介紹了MySQL出現(xiàn)莫名其妙的斷開連接以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • mysql字段名和關鍵字沖突的問題

    mysql字段名和關鍵字沖突的問題

    這篇文章主要介紹了mysql字段名和關鍵字沖突的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • mysql的內連接,左連接和右鏈接查詢詳解

    mysql的內連接,左連接和右鏈接查詢詳解

    這篇文章主要為大家詳細介紹了mysql的內連接,左連接和右鏈接查詢,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • MySQL的索引詳解

    MySQL的索引詳解

    這篇文章主要介紹了MySQL的索引的一些資料,對于mysql的優(yōu)化來說索引是不得不說的,這里就為大家介紹一下,需要的朋友可以參考一下
    2018-01-01

最新評論