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

MySQL之InnoDB中的鎖用法

 更新時間:2025年06月26日 08:42:18   作者:在成都搬磚的鴨鴨  
這篇文章主要介紹了MySQL之InnoDB中的鎖用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1、背景

為了滿足數(shù)據(jù)庫對數(shù)據(jù)的一致性、事務(wù)隔離性、高并發(fā)性能需求,就有了鎖機制,InnoDB的鎖機制是實現(xiàn)事務(wù)隔離性和并發(fā)控制的核心組件,接下來就來講一下鎖機制相關(guān)知識。

2、事務(wù)并發(fā)問題的三種場景

【1】讀讀場景

并發(fā)讀不會有啥問題,這種場景不會對數(shù)據(jù)有啥影響。

【2】寫寫場景

并發(fā)寫會產(chǎn)生臟寫,也就是一個事務(wù)會修改另一個未提交事務(wù)修改過的結(jié)果,所以需要鎖來進行并發(fā)控制,鎖的結(jié)構(gòu)如下:

在這里插入圖片描述

其字段含義為:

字段含義
事務(wù)信息代表這個鎖結(jié)構(gòu)屬于哪個事務(wù)
is_waitingfalse-成功獲取到鎖,可以修改數(shù)據(jù);true-需要等待鎖釋放

【3】讀寫或?qū)懽x場景

這種場景會帶來臟讀、幻讀、不可重復(fù)讀問題,不同隔離級別可能帶來的問題如下:

隔離級別可能帶來的問題
READ UNCOMMITTED臟讀、不可重復(fù)讀、幻讀
READ COMMIT不可重復(fù)讀、幻讀
REPEATABLE READ幻讀
SERIALIZABLE無問題

為了解決臟讀、幻讀、不可重復(fù)讀的問題有兩種方案:

  • 方案一:讀操作使用MVCC,寫操作加鎖。
  • 方案二:讀、寫操作都加鎖。

3、一致性讀

事務(wù)利用MVCC進行的讀取操作稱為一致性讀,所有普通的SELECT語句在讀已提交、可重復(fù)讀的隔離級別下都算是一致性讀,一致性讀不會對記錄做加鎖操作,其它事務(wù)可以修改記錄。

4、鎖定讀

【1】共享鎖和獨占鎖

在使用加鎖方式解決并發(fā)問題時,要保證讀讀操作不受影響,寫寫、讀寫、寫讀操作相互阻塞,所以將鎖分為了兩類,共享鎖和獨占鎖,其含義為:

名稱含義
共享鎖簡稱S鎖,事務(wù)讀取一條記錄時,需要先獲取該記錄的鎖
獨占鎖也叫排他鎖,簡稱X鎖,在事務(wù)改動一條記錄時,需要先獲取該記錄的X鎖

【2】鎖定讀的兩種語句

對讀取的記錄加s鎖:

SELECT … LOCK IN SHARE MODE;

對讀取的記錄加x鎖:

SELECT … FOR UPDATE;

5、寫操作

DELETE:

對一條記錄做DELETE操作的過程是先獲取該記錄在B+樹中的位置,然后獲取這條記錄的x鎖,再執(zhí)行delete mark操作。我們可以把在B+樹中找這條記錄的過程看成一個獲取x鎖的鎖定讀。

UPDATE:

1、如果未修改該記錄的鍵值并且被更新的列占用的存儲空間在修改前后未發(fā)生變化,就先在B+樹中定位這條記錄的位置,然后再獲取一下記錄的x鎖,最后在原位置進行修改操作??梢园堰@個在B+樹中定位修改記錄的過程看出有個獲取x鎖的鎖定讀。

2、如果未修改該記錄的鍵值并且至少有一個被更新的列占用的存儲空間在修改前后發(fā)生了變化,就先在B+樹中獲取這條記錄的位置,然后獲取這條記錄的x鎖,將該記錄徹底刪掉也就是移入垃圾鏈表,最后再插入一條新記錄,這個在B+樹中找到要刪除的記錄的過程可以看成一個獲取x鎖的鎖定讀,新插入的記錄由INSERT操作提供的隱式鎖進行保護。

3、如果修改了該記錄的鍵值,相當(dāng)于在原記錄上做DELETE操作再來一次INSERT操作,加鎖規(guī)則就按照DELETE和INSERT的規(guī)則進行。

INSERT:

通過隱式鎖來保護插入的這條記錄不被其它事務(wù)訪問。

6、InnoDB中的表級鎖

【1】表級別的S鎖、X鎖

在對某個表執(zhí)行SELECT、INSERT、DELETE、UPDATE語句時,InnoDB存儲引擎是不會為這個表添加表級別的s鎖或x鎖的。

對某個表執(zhí)行ALTER TABLE、DROP TABLE這類DDL語句時和SELECT、INSERT、DELETE、UPDATE語句是相互阻塞的,這個阻塞是通過server層中的元數(shù)據(jù)鎖(簡稱MDL)來實現(xiàn)的。

【2】表級別的IS鎖、IX鎖

IS鎖和IX鎖的含義如下:

名稱含義
IS鎖意向共享鎖,當(dāng)事務(wù)準(zhǔn)備在某條記錄上加S鎖時,需先在表級別加一個IS鎖
IX鎖意向獨占鎖,當(dāng)事務(wù)準(zhǔn)備在某條記錄上加X鎖時,需先在表級別加一個IX鎖

【3】表級別的AUTO-INC鎖

主鍵自增id,也就是帶AUTO_INCREMENT屬性的列就使用AUTO-INC鎖。

7、InnoDB中的行級鎖

【1】LOCK_REC_NOT_GAP行鎖類型

這個類型鎖分為s鎖和x鎖,和我們前面講的共享鎖和獨占鎖一樣。

【2】LOCK_GAP行鎖類型

這個類型的鎖會阻塞當(dāng)前加鎖的這條記錄和上一條記錄之間的間隙插入。

【3】LOCK_ORDINARY行鎖類型

這個類型的鎖會保護當(dāng)前被鎖住的記錄,并且阻塞這條記錄和上一條記錄的間隙插入。

【4】Insert Intention Locks行鎖類型

被間隙阻塞插入的記錄就會有有這樣一個類型的鎖結(jié)構(gòu)。

【5】隱式鎖

保護事務(wù)插入時的并發(fā)問題。

8、總結(jié)

InnoDB鎖機制的背景是在保護事務(wù)隔離性的前提下最大化并發(fā)性,通過MVCC、行鎖、表鎖的協(xié)同,滿足高并發(fā)場景需求。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL如何給查出的數(shù)據(jù)加上序號(最新整理)

    MySQL如何給查出的數(shù)據(jù)加上序號(最新整理)

    這篇文章主要介紹了MySQL如何給查出的數(shù)據(jù)加上序號,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-04-04
  • MySQL數(shù)據(jù)庫SSL安全連接方式

    MySQL數(shù)據(jù)庫SSL安全連接方式

    本文主要介紹了MySQL?8.0.43的SSL配置和使用方法,包括SSL證書的創(chuàng)建、SSL連接的配置、SSL用戶的安全設(shè)置以及SSL登錄的實現(xiàn),SSL可以確保數(shù)據(jù)在傳輸過程中的機密性、完整性和身份驗證,從而提高數(shù)據(jù)庫的安全性
    2025-11-11
  • PHP學(xué)習(xí)散記 2012_01_07(MySQL)

    PHP學(xué)習(xí)散記 2012_01_07(MySQL)

    數(shù)據(jù)庫是Web大多數(shù)應(yīng)用開發(fā)的基礎(chǔ)。如果你是用PHP,那么大多數(shù)據(jù)庫用的是MYSQL也是LAMP架構(gòu)的重要部分
    2012-01-01
  • 探索MySQL?8中utf8mb4釋放多語言數(shù)據(jù)的強大潛力

    探索MySQL?8中utf8mb4釋放多語言數(shù)據(jù)的強大潛力

    這篇文章主要為大家介紹了探索MySQL?8中utf8mb4釋放多語言數(shù)據(jù)的強大潛力,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • MySQL數(shù)據(jù)過濾與計算字段實戰(zhàn)指南

    MySQL數(shù)據(jù)過濾與計算字段實戰(zhàn)指南

    本文介紹了MySQL數(shù)據(jù)過濾與計算字段的實戰(zhàn)技術(shù),包括多條件組合、通配符過濾、正則表達式搜索和計算字段的使用,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • mysql多表查詢的幾種分類詳細

    mysql多表查詢的幾種分類詳細

    本文主要介紹了mysql多表查詢的幾種分類詳細,主要包括3大分類,等值連接 vs 非等值連接,自連接 vs 非自連接,內(nèi)連接 vs 外連接,文章介紹的非常詳細,感興趣的可以了解一下
    2022-02-02
  • mysql-5.7.42升級到mysql-8.2.0(二進制方式)

    mysql-5.7.42升級到mysql-8.2.0(二進制方式)

    隨著數(shù)據(jù)量的增長和業(yè)務(wù)需求的變更,我們可能需要升級MySQL,本文主要介紹了mysql-5.7.42升級到mysql-8.2.0(二進制方式),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • MySQL 聚簇索引、非聚簇索引與回表詳解

    MySQL 聚簇索引、非聚簇索引與回表詳解

    本文我們從數(shù)據(jù)庫物理存儲的底層邏輯出發(fā),系統(tǒng)拆解了聚簇索引與非聚簇索引的核心概念、存儲結(jié)構(gòu)、查詢流程,以及"回表"操作的本質(zhì),感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • MySQL筆記之修改數(shù)據(jù)的解決方法

    MySQL筆記之修改數(shù)據(jù)的解決方法

    本篇文章介紹了,在mysql中修改數(shù)據(jù)的解決方法。需要的朋友參考下
    2013-05-05
  • MySQL Workbench中的權(quán)限設(shè)置不生效

    MySQL Workbench中的權(quán)限設(shè)置不生效

    MySQL賬號即使只被授予特定數(shù)據(jù)庫權(quán)限,仍可能因擁有全局權(quán)限而查看所有數(shù)據(jù)庫,本文分析該現(xiàn)象成因,提供排查方法,并給出三種解決方案,感興趣的可以了解一下
    2026-04-04

最新評論

游戏| 海晏县| 额敏县| 永州市| 广丰县| 兴山县| 肇庆市| 丰县| 滕州市| 廉江市| 万全县| 濮阳市| 金华市| 奉化市| 环江| 巴南区| 高要市| 新巴尔虎右旗| 龙南县| 泰安市| 靖州| 文登市| 拜城县| 玉田县| 屏东市| 临潭县| 徐闻县| 博爱县| 三河市| 海丰县| 安庆市| 巴南区| 高唐县| 固镇县| 宜兰县| 南京市| 杂多县| 台中县| 连南| 安化县| 金门县|