欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL之InnoDB中的鎖用法

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

1、背景

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

2、事務(wù)并發(fā)問(wèn)題的三種場(chǎng)景

【1】讀讀場(chǎng)景

并發(fā)讀不會(huì)有啥問(wèn)題,這種場(chǎng)景不會(huì)對(duì)數(shù)據(jù)有啥影響。

【2】寫寫場(chǎng)景

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

在這里插入圖片描述

其字段含義為:

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

【3】讀寫或?qū)懽x場(chǎng)景

這種場(chǎng)景會(huì)帶來(lái)臟讀、幻讀、不可重復(fù)讀問(wèn)題,不同隔離級(jí)別可能帶來(lái)的問(wèn)題如下:

隔離級(jí)別可能帶來(lái)的問(wèn)題
READ UNCOMMITTED臟讀、不可重復(fù)讀、幻讀
READ COMMIT不可重復(fù)讀、幻讀
REPEATABLE READ幻讀
SERIALIZABLE無(wú)問(wèn)題

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

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

3、一致性讀

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

4、鎖定讀

【1】共享鎖和獨(dú)占鎖

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

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

【2】鎖定讀的兩種語(yǔ)句

對(duì)讀取的記錄加s鎖:

SELECT … LOCK IN SHARE MODE;

對(duì)讀取的記錄加x鎖:

SELECT … FOR UPDATE;

5、寫操作

DELETE:

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

UPDATE:

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

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

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

INSERT:

通過(guò)隱式鎖來(lái)保護(hù)插入的這條記錄不被其它事務(wù)訪問(wèn)。

6、InnoDB中的表級(jí)鎖

【1】表級(jí)別的S鎖、X鎖

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

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

【2】表級(jí)別的IS鎖、IX鎖

IS鎖和IX鎖的含義如下:

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

【3】表級(jí)別的AUTO-INC鎖

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

7、InnoDB中的行級(jí)鎖

【1】LOCK_REC_NOT_GAP行鎖類型

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

【2】LOCK_GAP行鎖類型

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

【3】LOCK_ORDINARY行鎖類型

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

【4】Insert Intention Locks行鎖類型

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

【5】隱式鎖

保護(hù)事務(wù)插入時(shí)的并發(fā)問(wèn)題。

8、總結(jié)

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

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

相關(guān)文章

  • 后端服務(wù)器中如何實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)操作接口

    后端服務(wù)器中如何實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)操作接口

    文章主要介紹了如何在Node.js中使用mysql模塊連接MySQL數(shù)據(jù)庫(kù),并通過(guò)Express框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作接口,前端可以通過(guò)Axios庫(kù)與后端進(jìn)行交互,實(shí)現(xiàn)數(shù)據(jù)操作
    2024-11-11
  • MySQL的Replace into 與Insert into on duplicate key update真正的不同之處

    MySQL的Replace into 與Insert into on duplicate key update真正的不同

    今天聽同事介紹oracle到mysql的數(shù)據(jù)migration,他用了Insert into ..... on duplicate key update ...,我當(dāng)時(shí)就想怎么不用Replace呢,于是回來(lái)就仔細(xì)查了下,它們果然還是有區(qū)別的
    2014-02-02
  • MySQL索引查詢limit?offset及排序order?by用法

    MySQL索引查詢limit?offset及排序order?by用法

    這篇文章主要介紹了MySQL限制數(shù)據(jù)返回條數(shù)limit?offset及排序order?by用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • linux采用binary方式安裝mysql

    linux采用binary方式安裝mysql

    這篇文章主要為大家詳細(xì)介紹了linux采用binary方式安裝mysql步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • MySQL一對(duì)多查詢的實(shí)現(xiàn)示例

    MySQL一對(duì)多查詢的實(shí)現(xiàn)示例

    一對(duì)多連接查詢就是其中一種常見的查詢方式,它可以將一張表中的一行記錄與多張表中的多行記錄關(guān)聯(lián)起來(lái),并將其結(jié)果輸出,本文就來(lái)介紹一下如何使用,感興趣的可以了解一下
    2023-10-10
  • MySQL數(shù)據(jù)庫(kù)wait_timeout參數(shù)詳細(xì)介紹

    MySQL數(shù)據(jù)庫(kù)wait_timeout參數(shù)詳細(xì)介紹

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)wait_timeout參數(shù)詳細(xì)介紹的相關(guān)資料,wait_timeout是MySQL中用于控制非交互式連接等待時(shí)間的系統(tǒng)變量,影響服務(wù)器資源管理和安全性,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • 使用Mysql5.x以上版本出現(xiàn)報(bào)錯(cuò)#1929 Incorrect datetime value: '''''''' for column ''''createtime''''的快速解決方法

    使用Mysql5.x以上版本出現(xiàn)報(bào)錯(cuò)#1929 Incorrect datetime value: '''''''' f

    我的MySQL安裝后,保存刪除表數(shù)據(jù)總是出現(xiàn)#1929 Incorrect datetime value: '' for column 'createtime' 的報(bào)錯(cuò)提醒,導(dǎo)致不能刪除表里數(shù)據(jù)。下面小編給大家分析原因及解決辦法,需要的朋友可以參考下
    2017-01-01
  • Mybatis特殊字符處理的詳解

    Mybatis特殊字符處理的詳解

    這篇文章主要介紹了Mybatis特殊字符處理的詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Mysql數(shù)據(jù)庫(kù)分庫(kù)和分表方式(常用)

    Mysql數(shù)據(jù)庫(kù)分庫(kù)和分表方式(常用)

    本文主要給大家介紹Mysql數(shù)據(jù)庫(kù)分庫(kù)和分表方式(常用),涉及到mysql數(shù)據(jù)庫(kù)相關(guān)知識(shí),對(duì)mysql數(shù)據(jù)庫(kù)分庫(kù)分表相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • 一文帶你深入了解并掌握MySQL的DML和DCL

    一文帶你深入了解并掌握MySQL的DML和DCL

    在數(shù)據(jù)庫(kù)管理中,數(shù)據(jù)操作語(yǔ)言(DML)和數(shù)據(jù)控制語(yǔ)言(DCL)是至關(guān)重要的概念,DML使我們能夠?qū)?shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行增加、修改和刪除操作,本文將深入探討這兩個(gè)關(guān)鍵領(lǐng)域的核心概念和操作方法,幫助您更好地理解和應(yīng)用數(shù)據(jù)庫(kù)管理技術(shù)
    2024-02-02

最新評(píng)論