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

MySQL?事務(wù)隔離性及鎖處理方式

 更新時(shí)間:2025年12月05日 11:07:37   作者:321茄子  
MySQL的事務(wù)隔離性確保了多個(gè)并發(fā)事務(wù)之間的相互隔離,通過(guò)不同的隔離級(jí)別和鎖機(jī)制來(lái)實(shí)現(xiàn),這篇文章給大家介紹MySQL事務(wù)隔離性及鎖處理方式,感興趣的朋友一起看看吧

一、事務(wù)隔離性概述

事務(wù)隔離性(Isolation) 是指多個(gè)并發(fā)事務(wù)之間相互隔離,一個(gè)事務(wù)的執(zhí)行不應(yīng)該影響其他事務(wù)的執(zhí)行。

MySQL 支持四種事務(wù)隔離級(jí)別,默認(rèn)隔離級(jí)別:可重復(fù)讀(Repeatable Read)。

鎖的行為與事務(wù)的隔離級(jí)別緊密相關(guān):

讀未提交:通常不加鎖,通過(guò)直接讀最新數(shù)據(jù)實(shí)現(xiàn),存在臟讀、幻讀等問(wèn)題。

讀已提交:每次讀取的都是已提交的最新數(shù)據(jù)(快照)。 對(duì)于 UPDATE、DELETE,只對(duì)實(shí)際修改的行加鎖(記錄鎖),不使用間隙鎖,所無(wú)法避免幻讀。

可重復(fù)讀(InnoDB 的默認(rèn)級(jí)別):在事務(wù)開(kāi)始時(shí)創(chuàng)建一致性視圖,整個(gè)事務(wù)期間都讀取這個(gè)視圖。使用臨鍵鎖作為默認(rèn)的行鎖算法,通過(guò)鎖住記錄和間隙來(lái)防止幻讀。

串行化:最高的隔離級(jí)別,通過(guò)強(qiáng)制事務(wù)串行執(zhí)行來(lái)避免所有并發(fā)問(wèn)題。 在這個(gè)級(jí)別下,InnoDB 可能會(huì)隱式地將普通的 SELECT 語(yǔ)句轉(zhuǎn)換為 SELECT ... FORSHARE,從而加共享鎖,導(dǎo)致讀讀也可能阻塞。

二、MySQL 保證隔離性的機(jī)制

MySQL 的鎖機(jī)制是為了在并發(fā)訪(fǎng)問(wèn)下,保證數(shù)據(jù)的一致性、完整性而設(shè)計(jì)的。它可以大致分為以下三個(gè)維度來(lái)理解:

  • 鎖的粒度:鎖定的范圍大小
  • 鎖的模式:鎖的兼容性,即多個(gè)鎖之間能否共存
  • 鎖的類(lèi)型:從程序員視角看,鎖的共享與排他特性

按鎖的粒度劃分

1 全局鎖,作用范圍:整個(gè)數(shù)據(jù)庫(kù)實(shí)例。

FLUSH TABLES WITH READ LOCK;
SET read_only = ON

效果:使數(shù)據(jù)庫(kù)處于只讀狀態(tài),所有數(shù)據(jù)修改操作(DML)和數(shù)據(jù)結(jié)構(gòu)變更操作 (DDL)都會(huì)被阻塞。

使用場(chǎng)景:全庫(kù)邏輯備份。但請(qǐng)注意,在 InnoDB 中,由于有 MVCC,通常使 用 mysqldump --single-transaction 來(lái)進(jìn)行不鎖表的熱備份,這比全局鎖更好。

2 表級(jí)鎖,作用范圍:整張表

LOCK TABLES table_name READ/WRITE; 和 UNLOCK TABLES;

MyISAM 引擎默認(rèn)使用表鎖。

元數(shù)據(jù)鎖:不需要顯式使用,在執(zhí)行 DML(如 SELECT, INSERT, UPDATE, DELETE)時(shí)自動(dòng)加,防止表結(jié)構(gòu)被修改。讀鎖之間不互斥,但寫(xiě)鎖是排他的。

意向鎖:InnoDB 特有的表級(jí)鎖,用于快速判斷表內(nèi)是否有行鎖沖突。

效果:鎖定整張表,粒度大,并發(fā)性能差。

3 行級(jí)鎖, 作用范圍:?jiǎn)涡谢蚨嘈杏涗?/h4>

支持引擎:InnoDB。

效果:粒度最小,只鎖定需要操作的行,極大提高了并發(fā)性能。但管理開(kāi)銷(xiāo)最大,容易  導(dǎo)致死鎖。

實(shí)現(xiàn)方式:InnoDB 通過(guò)給索引項(xiàng)加鎖來(lái)實(shí)現(xiàn)行鎖。這意味著:如果查詢(xún)條件沒(méi)有用到索引,InnoDB 會(huì)退化為表鎖,行鎖實(shí)際上是加在索引記錄上的。

InnoDB 的行鎖模式(鎖的類(lèi)型)

 1 共享鎖,簡(jiǎn)稱(chēng):S 鎖。

特性:又稱(chēng)為讀鎖。一個(gè)事務(wù)獲取了某行的共享鎖后,其他事務(wù)也可以獲取同一行的共享鎖(讀讀兼容),但不能獲取該行的排他鎖(讀寫(xiě)不兼容)。

加鎖方式

SELECT ... LOCK IN SHARE MODE; -- 在舊版本中
SELECT ... FOR SHARE; -- 在 MySQL 8.0+ 中推薦使用

 2 排他鎖,簡(jiǎn)稱(chēng):X 鎖。

特性:又稱(chēng)為寫(xiě)鎖。一個(gè)事務(wù)獲取了某行的排他鎖后,其他事務(wù)既不能獲取該行的共享鎖,也不能獲取該行的排他鎖(寫(xiě)寫(xiě)、讀寫(xiě)都不兼容)。

加鎖方式:

   SELECT ... FOR UPDATE;

DML 語(yǔ)句(UPDATE, DELETE, INSERT)會(huì)自動(dòng)給涉及的行加上排他鎖。

兼容性矩陣:

三、行鎖的算法(鎖定了哪些數(shù)據(jù))

InnoDB 的行鎖是通過(guò)對(duì)索引項(xiàng)加鎖實(shí)現(xiàn)的,根據(jù)查詢(xún)條件和索引使用情況,鎖定的范圍有所不同。

3.1 記錄鎖

鎖定:單個(gè)索引記錄。

場(chǎng)景:當(dāng)語(yǔ)句精確匹配到某一條記錄,且使用了唯一索引(包括主鍵)時(shí)。

示例:

 SELECT * FROM users WHERE id = 10 FOR UPDATE;
 如果 id 是主鍵,這條語(yǔ)句會(huì)在 id=10 這條索引記錄上加 X 鎖。

3.2 間隙鎖

鎖定:一個(gè)索引區(qū)間,但不包括記錄本身。例如鎖住 (5, 10) 這個(gè)開(kāi)區(qū)間。

目的:防止其他事務(wù)在區(qū)間內(nèi)插入新的記錄,從而解決幻讀問(wèn)題。

場(chǎng)景:使用范圍查詢(xún)或者查詢(xún)不存在的記錄時(shí)。

示例:

SELECT * FROM users WHERE id BETWEEN 5 AND 10 FOR UPDATE;
這條語(yǔ)句會(huì)鎖住 id 在 (5, 10) 區(qū)間內(nèi)的所有“間隙”,防止插入 id=6,7,8,9 的新記錄。

3.3 臨鍵鎖

鎖定:一個(gè)索引記錄 + 該記錄之前的間隙。它是 記錄鎖 + 間隙鎖 的組合。

目的:InnoDB 默認(rèn)的行鎖算法。它既鎖住了記錄本身,也鎖住了它之前的間隙,從在 “可重復(fù)讀”隔離級(jí)別下有效地防止了幻讀。

示例:如果表中有記錄 id=5, 10, 15。

 SELECT * FROM users WHERE id > 10 AND id <= 15 FOR UPDATE;
 這條語(yǔ)句會(huì)鎖定 (10, 15] 這個(gè)區(qū)間。它鎖住了 id=15 這條記錄(記錄鎖),
以及 (10,15) 這個(gè)間隙(間隙鎖)。

四、 死鎖

當(dāng)兩個(gè)或多個(gè)事務(wù)相互等待對(duì)方釋放鎖時(shí),就會(huì)發(fā)生死鎖。

示例:

事務(wù) A:UPDATE table SET ... WHERE id = 1; (持有 id=1 的 X 鎖)

事務(wù) B:UPDATE table SET ... WHERE id = 2; (持有 id=2 的 X 鎖)

事務(wù) A:UPDATE table SET ... WHERE id = 2; (等待事務(wù) B 釋放 id=2 的鎖)

事務(wù) B:UPDATE table SET ... WHERE id = 1; (等待事務(wù) A 釋放 id=1 的鎖)
 -> 死鎖發(fā)生!

InnoDB 的處理方式:

InnoDB 有一個(gè)內(nèi)置的死鎖檢測(cè)機(jī)制,會(huì)主動(dòng)選擇一個(gè)回滾成本較小的事務(wù)(通常就是影響行數(shù)較少的事務(wù))進(jìn)行回滾,并報(bào)出 1213 錯(cuò)誤(Deadlock found when trying to get lock)。

另一個(gè)事務(wù)則可以繼續(xù)執(zhí)行。

如何避免死鎖:

盡量讓事務(wù)以相同的順序訪(fǎng)問(wèn)表和行。

在事務(wù)中,盡量一次鎖定所有需要的資源,減少事務(wù)大小。

使用較低的隔離級(jí)別(如 Read Committed)可以減少間隙鎖的使用,從而降低死鎖概率。

為表添加合理的索引,避免全表掃描導(dǎo)致鎖表。

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

相關(guān)文章

  • MYSQL大表改字段慢問(wèn)題的解決

    MYSQL大表改字段慢問(wèn)題的解決

    本文主要介紹了MYSQL大表改字段慢問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • MySQL實(shí)現(xiàn)導(dǎo)出excel的方法分析

    MySQL實(shí)現(xiàn)導(dǎo)出excel的方法分析

    這篇文章主要介紹了MySQL實(shí)現(xiàn)導(dǎo)出excel的方法,結(jié)合實(shí)例形式分析了基于php、js等方法實(shí)現(xiàn)mysql導(dǎo)出Excel的相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • mysql 8.0.15 壓縮版安裝圖文教程

    mysql 8.0.15 壓縮版安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.15 壓縮版安裝圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • MySQL給新建用戶(hù)并賦予權(quán)限最簡(jiǎn)單的方法

    MySQL給新建用戶(hù)并賦予權(quán)限最簡(jiǎn)單的方法

    在本篇文章里小編給大家整理的是一篇關(guān)于MySQL給新建用戶(hù)并賦予權(quán)限最簡(jiǎn)單的方法,需要的朋友們參考下。
    2019-11-11
  • mysql查線(xiàn)上數(shù)據(jù)注意數(shù)據(jù)庫(kù)的隔離級(jí)別

    mysql查線(xiàn)上數(shù)據(jù)注意數(shù)據(jù)庫(kù)的隔離級(jí)別

    數(shù)據(jù)庫(kù)的隔離級(jí)別關(guān)乎事務(wù)對(duì)其他并發(fā)事務(wù)的可見(jiàn)性及其對(duì)數(shù)據(jù)庫(kù)的影響,隔離級(jí)別的選擇決定了并發(fā)性能和數(shù)據(jù)一致性的平衡,SQL標(biāo)準(zhǔn)定義了四種隔離級(jí)別,每種級(jí)別都有不同的應(yīng)用場(chǎng)景和防止并發(fā)問(wèn)題的能力,感興趣的可以了解一下
    2024-10-10
  • MySQL5.6.40在CentOS7 64下安裝過(guò)程詳解

    MySQL5.6.40在CentOS7 64下安裝過(guò)程詳解

    這篇文章主要介紹了MySQL5.6.40在CentOS7 64下安裝過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • MySQL數(shù)據(jù)庫(kù)修復(fù)方法(MyISAM/InnoDB)

    MySQL數(shù)據(jù)庫(kù)修復(fù)方法(MyISAM/InnoDB)

    這篇文章主要為大家整理了7條修復(fù)MySQL數(shù)據(jù)庫(kù)的方法,當(dāng)簡(jiǎn)單的重啟對(duì)數(shù)據(jù)庫(kù)不起作用,或者有表崩潰時(shí),需要的朋友可以參考下
    2014-06-06
  • mysql請(qǐng)求阻塞問(wèn)題解析

    mysql請(qǐng)求阻塞問(wèn)題解析

    這篇文章主要介紹了mysql請(qǐng)求阻塞問(wèn)題解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-10-10
  • 分析Mysql事務(wù)和數(shù)據(jù)的一致性處理問(wèn)題

    分析Mysql事務(wù)和數(shù)據(jù)的一致性處理問(wèn)題

    本篇文章主要給大家介紹了Mysql事務(wù)和數(shù)據(jù)的一致性處理問(wèn)題,跟著小編一起學(xué)習(xí)下吧。
    2017-12-12
  • MySQL基本命令、常用命令總結(jié)

    MySQL基本命令、常用命令總結(jié)

    這篇文章主要介紹了MySQL基本命令、常用命令總結(jié),需要的朋友可以參考下
    2014-03-03

最新評(píng)論

广南县| 张家川| 体育| 通许县| 理塘县| 莒南县| 三门县| 台中县| 易门县| 潜江市| 德庆县| 江山市| 墨玉县| 云霄县| 册亨县| 新建县| 景洪市| 镇安县| 井陉县| 西丰县| 姜堰市| 巨野县| 马尔康县| 柘荣县| 桦川县| 呼伦贝尔市| 册亨县| 留坝县| 亚东县| 通州市| 噶尔县| 绩溪县| 阳原县| 新安县| 仲巴县| 开原市| 商河县| 格尔木市| 巨野县| 金昌市| 克拉玛依市|