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

MySQL 鎖全解:從行鎖到死鎖,一文講透所有面試考點(diǎn)

 更新時(shí)間:2026年05月23日 10:45:00   作者:fengxin_rou  
在MySQL中,鎖是實(shí)現(xiàn)并發(fā)控制的一種機(jī)制,用于管理對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的訪問(wèn),MySQL支持多種類型的鎖,包括表鎖和行鎖,這篇文章給大家介紹MySQL鎖全解:從行鎖到死鎖個(gè),感興趣的朋友一起看看吧

在MySQL中,鎖是實(shí)現(xiàn)并發(fā)控制的一種機(jī)制,用于管理對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的訪問(wèn)。MySQL支持多種類型的鎖,包括表鎖和行鎖。行鎖是較為先進(jìn)的鎖機(jī)制,因?yàn)樗试S多個(gè)事務(wù)同時(shí)對(duì)數(shù)據(jù)庫(kù)中的不同行進(jìn)行操作,從而提高并發(fā)性能。然而,如果不正確管理,即使是行鎖也可能導(dǎo)致死鎖。

行鎖

行鎖是MySQL中較為常見(jiàn)的一種鎖機(jī)制,它允許多個(gè)事務(wù)對(duì)不同的行進(jìn)行操作,而不會(huì)互相干擾。InnoDB存儲(chǔ)引擎使用行鎖來(lái)實(shí)現(xiàn)其多版本并發(fā)控制(MVCC)。

死鎖

死鎖是指兩個(gè)或多個(gè)事務(wù)在執(zhí)行過(guò)程中,因互相等待對(duì)方釋放資源而無(wú)法繼續(xù)執(zhí)行的情況。例如,事務(wù)A持有資源B并請(qǐng)求資源C,同時(shí)事務(wù)B持有資源C并請(qǐng)求資源A。

避免死鎖的策略

  • 使用索引‌:確保涉及的所有表都有適當(dāng)?shù)乃饕貏e是那些在WHERE子句中使用的列。
  • 鎖定順序‌:在應(yīng)用中強(qiáng)制一致的鎖定順序。所有事務(wù)都應(yīng)該以相同的順序請(qǐng)求資源。例如,始終先鎖定表A再鎖定表B。
    • 超時(shí)設(shè)置‌:設(shè)置InnoDB的innodb_lock_wait_timeout參數(shù),該參數(shù)定義了事務(wù)等待鎖的最長(zhǎng)時(shí)間。超過(guò)這個(gè)時(shí)間后,事務(wù)會(huì)自動(dòng)回滾以避免死鎖。
  • 使用樂(lè)觀鎖或悲觀鎖‌:
    • 悲觀鎖‌:在事務(wù)開(kāi)始時(shí)立即獲取所有需要的鎖。適用于寫操作較多的場(chǎng)景。
    • 樂(lè)觀鎖‌:不使用鎖,而是在更新數(shù)據(jù)前檢查版本號(hào)或時(shí)間戳。適用于讀多寫少的場(chǎng)景。
  • 檢測(cè)和解決死鎖‌:
    • 使用SHOW ENGINE INNODB STATUS命令查看死鎖日志,分析死鎖原因。
    • 使用INNODB_TRXINNODB_LOCKSINNODB_LOCK_WAITS表查詢當(dāng)前的事務(wù)和鎖情況。

mysql里有哪些鎖?

在MYSQL里把鎖分為三類:全局鎖、表鎖、行級(jí)鎖

全局鎖:在使用了flush tables with read lock語(yǔ)句之后,全庫(kù)都會(huì)進(jìn)入只讀狀態(tài),數(shù)據(jù)庫(kù)執(zhí)行增刪改和修改表結(jié)構(gòu)的操作時(shí),都會(huì)被阻塞;主要用于在全表進(jìn)行備份時(shí),防止其他事務(wù)修改表的數(shù)據(jù)

表級(jí)鎖:

        表鎖:使用lock tables語(yǔ)句就會(huì)給表上鎖,限制其他線程訪問(wèn)這張表,這里對(duì)線程有兩種限制方式:

1.讀鎖 lock tables 表名 read

本線程:可讀,不能寫

其他線程:可讀,不能寫

2.寫鎖 lock tables 表名 write

本線程:可讀可寫

其他線程:讀寫全都阻塞

        元數(shù)據(jù)鎖:對(duì)表上一個(gè)MDL鎖,如果是對(duì)表進(jìn)行CRUD操作,會(huì)對(duì)表上MDL讀鎖,如果是修改表的結(jié)構(gòu),就會(huì)對(duì)表上一個(gè)MDL寫鎖,MDL鎖的作用是防止線程在操作表時(shí),其他線程影響表的結(jié)構(gòu)和數(shù)據(jù)

        意向鎖當(dāng)執(zhí)行插入、更新、刪除操作,需要先對(duì)表加上「意向獨(dú)占鎖」,然后對(duì)該記錄加獨(dú)占鎖。意向鎖用于確定這個(gè)表是否有行級(jí)鎖

兩類意向鎖:

  • 意向共享 IS:后續(xù)要加共享行鎖(S鎖)
  • 意向獨(dú)占 IX:后續(xù)要加獨(dú)占行鎖(增刪改都會(huì)觸發(fā)、X鎖)

行級(jí)鎖:InnoDB 引擎是支持行級(jí)鎖的,而 MyISAM 引擎并不支持行級(jí)鎖。

        記錄鎖(Record Lock):分為S讀鎖和X寫鎖,滿足讀寫互斥和寫寫互斥

已有鎖加 S 鎖加 X 鎖
S 鎖允許阻塞
X 鎖阻塞阻塞

        間隙鎖(Gap Lock):只存在于可重復(fù)讀隔離級(jí)別,是為了解決可重復(fù)讀(RR)隔離級(jí)別下的幻讀現(xiàn)象。

        臨鍵鎖(Next-key Lock):記錄鎖 + 間隙鎖合體,會(huì)鎖定一個(gè)范圍,并鎖定這個(gè)范圍的數(shù)據(jù)

InnoDB有哪些鎖呢:行級(jí)鎖、表鎖、意向鎖

行鎖什么時(shí)候變表鎖?

這里不是有一個(gè)升級(jí)閾值一樣的規(guī)定,所謂 “行鎖變表鎖”,是看起來(lái)像鎖表,本質(zhì)是鎖了全表所有行 / 大范圍間隙,效果等價(jià)于表鎖。

InnoDB 行鎖依托索引生效,無(wú)索引 / 索引失效時(shí)會(huì)全表掃描,行操作就會(huì)查詢?nèi)?,然后給所有行加鎖效果等價(jià)于表鎖

臨鍵鎖怎么解決幻讀?

因?yàn)榕R建鎖 = 間隙鎖 + 記錄鎖,利用這兩個(gè)鎖的機(jī)制就可以大幅度的減少幻讀的發(fā)生

  • 鎖住查到的真實(shí)數(shù)據(jù)行(記錄鎖) 不讓別人修改已有數(shù)據(jù)
  • 鎖住數(shù)據(jù)前后的空白間隙(間隙鎖) 區(qū)間內(nèi)無(wú)法插入新記錄
  • 范圍查詢會(huì)鎖定一整個(gè)左開(kāi)右閉區(qū)間 別的事務(wù)插不進(jìn)區(qū)間空位,自然不會(huì)憑空多出數(shù)據(jù),大幅規(guī)避幻讀

什么是死鎖?產(chǎn)生條件、怎么排查和避免死鎖?

死鎖定義:

兩個(gè)事務(wù)互相持有對(duì)方的鎖,并且自身不會(huì)主動(dòng)釋放鎖,互相陷入等待的循環(huán)就是鎖

產(chǎn)生條件:

  1. 互斥性:一把鎖只有一個(gè)事務(wù)可以拿到
  2. 請(qǐng)求并保持:持有鎖的同時(shí)去請(qǐng)求另一把鎖
  3. 不可剝奪:鎖不能被搶走,只能主動(dòng)釋放
  4. 循環(huán)等待:A等B的鎖,B等A的鎖

MySQL 排查死鎖

查看最近死鎖日志

show engine innodb status;

日志里看:阻塞 SQL、持有鎖、等待鎖、事務(wù)執(zhí)行順序,定位沖突語(yǔ)句

避免死鎖:

  1. 統(tǒng)一訪問(wèn)順序 :所有事務(wù)按相同順序操作表、操作行,杜絕循環(huán)等待。
  2. 縮小事務(wù)范圍 :事務(wù)盡量短小,盡早提交,減少鎖持有時(shí)間。
  3. 合理使用索引 :保證更新語(yǔ)句走索引,鎖定行數(shù)越少,鎖沖突越少。
  4. 避免事務(wù)內(nèi)等待交互 :不要事務(wù)中途等待用戶操作、接口調(diào)用,防止長(zhǎng)時(shí)間占鎖。

總結(jié):

主要是了解了mysql里面所有的鎖的定義,行鎖與表鎖并不是字面意思上的轉(zhuǎn)換,而是效果上在全盤掃描時(shí)實(shí)現(xiàn)了鎖全表的現(xiàn)象,臨鍵鎖解決幻讀,從臨鍵鎖的組成來(lái)分為鎖數(shù)據(jù)(記錄鎖)和鎖數(shù)據(jù)前后的空白間隙(間隙鎖),以及死鎖的相關(guān)知識(shí)。

到此這篇關(guān)于MySQL 鎖全解:從行鎖到死鎖,一文講透所有面試考點(diǎn)的文章就介紹到這了,更多相關(guān)mysql行鎖到死鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL配置my.ini文件全過(guò)程

    MySQL配置my.ini文件全過(guò)程

    文章介紹如何在忘記密碼或其他基礎(chǔ)問(wèn)題時(shí)修改my.ini文件來(lái)解決問(wèn)題,首先,需要停止數(shù)據(jù)庫(kù)服務(wù),然后新建并配置my.ini文件,刪除data文件夾,重新配置my.ini,重啟mysql并設(shè)置新密碼,最后測(cè)試是否成功
    2025-11-11
  • MySQL UPDATE 語(yǔ)句一個(gè)“經(jīng)典”的坑

    MySQL UPDATE 語(yǔ)句一個(gè)“經(jīng)典”的坑

    這篇文章主要介紹了MySQL UPDATE 語(yǔ)句一個(gè)“經(jīng)典”的坑,一個(gè)非常有意思的話題,感興趣的小伙伴可以參考下面文章的具體內(nèi)容哦
    2021-10-10
  • MySQL不可忽視的數(shù)據(jù)庫(kù)約束(維護(hù)數(shù)據(jù)秩序)

    MySQL不可忽視的數(shù)據(jù)庫(kù)約束(維護(hù)數(shù)據(jù)秩序)

    數(shù)據(jù)庫(kù)約束是數(shù)據(jù)庫(kù)管理中不可或缺的一部分,它們?cè)诰S護(hù)數(shù)據(jù)秩序、保證數(shù)據(jù)完整性和一致性方面發(fā)揮著重要作用,本文給大家介紹MySQL不可忽視的數(shù)據(jù)庫(kù)約束,感興趣的朋友一起看看吧
    2025-05-05
  • MySQL不使用order by實(shí)現(xiàn)排名的三種思路總結(jié)

    MySQL不使用order by實(shí)現(xiàn)排名的三種思路總結(jié)

    ORDER BY語(yǔ)句用于根據(jù)指定的列對(duì)結(jié)果集進(jìn)行排序,在日常開(kāi)發(fā)中也經(jīng)常會(huì)用到,但下面這篇文章主要給大家介紹了關(guān)于MySQL不使用order by實(shí)現(xiàn)排名的三種思路,需要的朋友可以參考下
    2021-06-06
  • MySQL中使用auto_increment修改初始值和步長(zhǎng)

    MySQL中使用auto_increment修改初始值和步長(zhǎng)

    本文主要介紹了MySQL中使用auto_increment修改初始值和步長(zhǎng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • MySQL 格式化時(shí)間的實(shí)現(xiàn)示例

    MySQL 格式化時(shí)間的實(shí)現(xiàn)示例

    MySQL提供了多種日期和時(shí)間類型,在處理時(shí)間時(shí)需要根據(jù)不同類型選擇不同的格式化方法,常用的日期類型有DATE、YEAR、TIME;常用的日期時(shí)間類型有DATETIME和TIMESTAMP,本文就來(lái)介紹一下MySQL 格式化時(shí)間,感興趣的可以了解一下
    2023-10-10
  • MySQL kill指令使用指南

    MySQL kill指令使用指南

    這篇文章主要介紹了MySQL kill指令的使用方法,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-12-12
  • mysql存儲(chǔ)過(guò)程原理與使用方法詳解

    mysql存儲(chǔ)過(guò)程原理與使用方法詳解

    這篇文章主要介紹了mysql存儲(chǔ)過(guò)程原理與使用方法,結(jié)合實(shí)例形式詳細(xì)分析了mysql存儲(chǔ)過(guò)程的優(yōu)缺點(diǎn)、定義、調(diào)用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • mysql中如何查詢數(shù)據(jù)庫(kù)中的表名

    mysql中如何查詢數(shù)據(jù)庫(kù)中的表名

    這篇文章主要介紹了mysql中如何查詢數(shù)據(jù)庫(kù)中的表名問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Mysql服務(wù)器的安裝配置與啟動(dòng)關(guān)閉方法詳解

    Mysql服務(wù)器的安裝配置與啟動(dòng)關(guān)閉方法詳解

    MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))應(yīng)用軟件之一
    2021-10-10

最新評(píng)論

和硕县| 如皋市| 梅州市| 盐津县| 望城县| 惠水县| 合水县| 红原县| 老河口市| 高碑店市| 宁陵县| 南涧| 宁安市| 滁州市| 句容市| 河南省| 米泉市| 石泉县| 镇赉县| 如东县| 饶阳县| 合作市| 堆龙德庆县| 巴南区| 葵青区| 贞丰县| 健康| 泰顺县| 如东县| 邯郸市| 锡林郭勒盟| 通江县| 台北市| 烟台市| 噶尔县| 安义县| 凤山县| 耒阳市| 舞阳县| 临安市| 佛坪县|