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

MySQL使用表鎖和行鎖的場景詳解

 更新時間:2022年09月08日 08:48:11   作者:陳樹義  
MySQL?Innodb?的鎖可以說是執(zhí)行引擎的并發(fā)基礎(chǔ)了,有了鎖才能保證數(shù)據(jù)的一致性。但你知道什么時候會用表鎖,什么時候會用行鎖嗎?本文就來和大家一起詳細(xì)聊聊

前言

MySQL Innodb 的鎖可以說是執(zhí)行引擎的并發(fā)基礎(chǔ)了,有了鎖才能保證數(shù)據(jù)的一致性。眾所周知,我們都知道 Innodb 有全局鎖、表級鎖、行級鎖三種,但你知道什么時候會用表鎖,什么時候會用行鎖嗎?

雖然對 MySQL 的知識點(diǎn)挺熟悉的,但一開始看到這個問題,樹哥也是有點(diǎn)懵,我還真沒從這個角度去思考過。大家可以暫時 1 分鐘思考下答案,后面我將帶大家弄清楚這個問題。

對于這個問題,我只能粗略地想起一些片段,例如:

  • 對于表級鎖而言,當(dāng)執(zhí)行 DDL 語句去修改表結(jié)構(gòu)時,會使用表級鎖。
  • 對于行級鎖而言,一般情況下都會默認(rèn)使用行級鎖,貌似是需要有索引匹配到才行。

上面就是我粗略想到的答案,不知道大家思考的答案是否和我一樣呢?下面就讓我?guī)е蠹襾頊亓?xí)下 MySQL 的鎖吧!

文章思維導(dǎo)圖

對于數(shù)據(jù)庫而言,其鎖范圍可以分為:

  • 全局鎖
  • 表級鎖
  • 行級鎖

全局鎖

全局鎖就是對整個數(shù)據(jù)庫實(shí)例加鎖。 MySQL 提供了一個加全局讀鎖的方法,命令是 Flush tables with read lock (FTWRL)。當(dāng)你需要讓整個庫處于只讀狀態(tài)的時候,可以使用這個命令,之后其他線程的以下語句會被阻塞:數(shù)據(jù)更新語句(數(shù)據(jù)的增刪改)、數(shù)據(jù)定義語句(包括建表、修改表結(jié)構(gòu)等)和更新類事務(wù)的提交語句。你可以理解為,全局鎖基本上把數(shù)據(jù)所所有的變更語句都鎖住了。

全局鎖的典型場景應(yīng)用場景是全庫邏輯備份,也就是把整個庫每個表都 select 出來存起來。上面說到全局鎖會鎖住所有變更語句,但這只是對于 MyISAM 存儲引擎而言的。對于 Innodb 而言,其可以利用 MVCC 實(shí)現(xiàn)數(shù)據(jù)的一致性視圖,從而不需要鎖整個庫就可以實(shí)現(xiàn)全庫的數(shù)據(jù)備份。

表級鎖

表級鎖可以分為:表鎖、元數(shù)據(jù)鎖、意向鎖三種。

表鎖

表鎖,顧名思義就是對某個表加鎖。

那什么時候會使用表鎖呢?

一般情況是對應(yīng)的存儲引擎沒有行級鎖(例如:MyIASM),或者是對應(yīng)的 SQL 語句沒有匹配到索引。

對于第一種情況而言,因?yàn)閷?yīng)存儲引擎不支持行鎖,所以只能是使用更粗粒度的鎖來實(shí)現(xiàn),這也比較好理解。

對于第二種情況而言,如果存儲引擎支持行鎖,但對應(yīng)的 SQL 就沒有使用索引,那么此時也是會全表掃描,那此時也是會使用表鎖。例如下面的語句沒有指定查詢列,或者指定了查詢列但是并沒有用到索引,那么也是會直接鎖定整個表。

//?沒有指定查詢列
select?*?from?user;
//?指定查詢列,但是沒有用到索引
select?*?from?user?where?name?=?'zhangsan';

上面說的索引,可以說是判斷是否會用行級鎖的關(guān)鍵。但我想到一個問題:如果查詢或更新用到了索引,但是查詢或更新的數(shù)據(jù)特別多,占全表的 80% 甚至更多,這時候是會用表鎖,還是行鎖呢? 這是一個很有意思的問題,感興趣的朋友自行弄個測試表驗(yàn)證一下,后續(xù)有機(jī)會我們再聊聊這個問題。

元數(shù)據(jù)鎖

元數(shù)據(jù),指的是我們的表結(jié)構(gòu)這些元數(shù)據(jù)。元數(shù)據(jù)鎖(Metadata Lock)自然是執(zhí)行 DDL 表結(jié)構(gòu)變更語句時,我們對表加上的一個鎖了。

那什么時候會使用元數(shù)據(jù)鎖這個表級鎖呢?

當(dāng)我們對一個表做增刪改查操作的時候,會加上 MDL 讀鎖;當(dāng)我們要對表結(jié)構(gòu)做變更時,就會加 MDL 寫鎖。

意向鎖

意向鎖,本質(zhì)上就是空間換時間的產(chǎn)物,是為了提高行鎖效率的一個東西。

在 InnoDB 中,我們對某條記錄進(jìn)行鎖定時,為了提高并發(fā)度,通常都只是鎖定這一行記錄,而不是鎖定整個表。而當(dāng)我們需要為整個表加 X 鎖的時候,我們就需要遍歷整個表的記錄,如果每條記錄都沒有被加鎖,才可以給整個表加 X 鎖。而這個遍歷過程就很費(fèi)時間,這時候就有了意向鎖的誕生。

意向鎖其實(shí)就是標(biāo)記這個表有沒有被鎖,如果有某條記錄被鎖住了,那么就必須獲取該表的意向鎖。所以當(dāng)我們需要判斷這個表的記錄有沒有被加鎖時,直接判斷意向鎖就可以了,減少了遍歷的時間,提高了效率,是典型的用空間換時間的做法。

那么什么時候會用到意向鎖呢?

很簡單,就是在對表中的行記錄加鎖的時候,就會用到意向鎖。

行級鎖

千呼萬喚,終于來到了行級鎖。

要知道的是,行級鎖是存儲引擎級別的鎖,需要存儲引擎支持才有效。目前 MyISAM 存儲引擎不支持行級鎖,而 Innodb 存儲引擎則支持行級鎖。而全局鎖、表級鎖,則是 MySQL 層面就支持的鎖。

那么什么時候會使用行級鎖呢?

當(dāng)增刪改查匹配到索引時,Innodb 會使用行級鎖。

如果沒有匹配不到索引,那么就會直接使用表級鎖。

總結(jié)

文章最后,我們回顧一下開頭提出的問題:Innodb 啥時候用表鎖,啥時候用行鎖?

表級鎖包括:表鎖、元數(shù)據(jù)鎖、意向鎖。

對于表鎖而言,當(dāng)存儲引擎不支持行級鎖時,使用表鎖。SQL 語句沒有匹配到索引時,使用表鎖。

對于元數(shù)據(jù)鎖而言,對表做增刪改查時,會加上 MDL 讀鎖。對表結(jié)構(gòu)做變更時,會加上 MDL 寫鎖。

對于意向鎖而言,對表中的行記錄加鎖時,會用到意向鎖。

而對于行級鎖而言,增刪改查匹配到索引時,會使用行級鎖。

文章思維導(dǎo)圖

以上就是MySQL使用表鎖和行鎖的場景詳解的詳細(xì)內(nèi)容,更多關(guān)于MySQL表鎖 行鎖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何解決mysql的count()函數(shù)條件表達(dá)式不生效問題

    如何解決mysql的count()函數(shù)條件表達(dá)式不生效問題

    該文章總結(jié)了SQL查詢中`count`函數(shù)統(tǒng)計錯誤的原因,以及三種解決方法:使用`ornull`方法、`IF()`函數(shù)和`casewhen`表達(dá)式,當(dāng)不滿足條件時,表達(dá)式的值為NULL
    2024-11-11
  • linux下安裝mysql簡單的方法

    linux下安裝mysql簡單的方法

    這篇文章主要介紹了 linux下安裝mysql簡單的方法,需要的朋友可以參考下
    2017-08-08
  • 怎樣獲取MySQL結(jié)果集的第一條記錄

    怎樣獲取MySQL結(jié)果集的第一條記錄

    這篇文章主要介紹了怎樣獲取MySQL結(jié)果集的第一條記錄問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Mysql5.7.14 linux版密碼忘記完美解決辦法

    Mysql5.7.14 linux版密碼忘記完美解決辦法

    這篇文章主要介紹了Mysql5.7.14 linux版密碼忘記完美解決辦法,需要的朋友可以參考下
    2017-08-08
  • mysql 5.7更改數(shù)據(jù)庫的數(shù)據(jù)存儲位置的解決方法

    mysql 5.7更改數(shù)據(jù)庫的數(shù)據(jù)存儲位置的解決方法

    隨著MySQL數(shù)據(jù)庫存儲的數(shù)據(jù)逐漸變大,已經(jīng)將原來的存儲數(shù)據(jù)的空間占滿了,導(dǎo)致mysql已經(jīng)鏈接不上了。所以要給存放的數(shù)據(jù)換個地方,下面小編給大家分享mysql 5.7更改數(shù)據(jù)庫的數(shù)據(jù)存儲位置的解決方法,一起看看吧
    2017-04-04
  • 分析MySQL拋出異常的幾種常見解決方式

    分析MySQL拋出異常的幾種常見解決方式

    在本文中,總結(jié)了開發(fā)過程中最為常見的幾種 MySQL 拋出的異常以及如何解決,包括高版本驅(qū)動的問題、時區(qū)配置問題、SSL 連接問題等。于我個人而言,這一篇足以解決目前項(xiàng)目中所有遇到的MySQL問題。同時,也希望本文能對 MySQL 數(shù)據(jù)庫初學(xué)者有一定的引導(dǎo)入門作用。
    2021-05-05
  • 防止MySQL重復(fù)插入數(shù)據(jù)的三種方法

    防止MySQL重復(fù)插入數(shù)據(jù)的三種方法

    在MySQL進(jìn)行數(shù)據(jù)插入操作時,總是會考慮是否會插入重復(fù)數(shù)據(jù),之前的操作都是先根據(jù)主鍵或者唯一約束條件進(jìn)行查詢,有就進(jìn)行更新沒有就進(jìn)行插入。代碼反復(fù)效率低下。
    2020-09-09
  • MySQL外鍵約束常見操作方法示例【查看、添加、修改、刪除】

    MySQL外鍵約束常見操作方法示例【查看、添加、修改、刪除】

    這篇文章主要介紹了MySQL外鍵約束常見操作方法,結(jié)合實(shí)例形式分析了mysql針對外鍵約束的查看、添加、修改、刪除等相關(guān)操作實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-05-05
  • MySQL數(shù)據(jù)庫安裝方法與圖形化管理工具介紹

    MySQL數(shù)據(jù)庫安裝方法與圖形化管理工具介紹

    這篇文章介紹了MySQL數(shù)據(jù)庫安裝方法與圖形化管理工具,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • MySQL root賬號遠(yuǎn)程新建數(shù)據(jù)庫報錯1044問題及解決方法

    MySQL root賬號遠(yuǎn)程新建數(shù)據(jù)庫報錯1044問題及解決方法

    這篇文章主要介紹了MySQL root賬號遠(yuǎn)程新建數(shù)據(jù)庫報錯1044問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論

和平县| 丹凤县| 洞口县| 青铜峡市| 巫山县| 宕昌县| 弥勒县| 额敏县| 周口市| 青岛市| 兰溪市| 锡林浩特市| 门源| 德钦县| 新龙县| 耒阳市| 萨迦县| 雷波县| 嘉禾县| 东辽县| 甘谷县| 巍山| 景泰县| 普定县| 永嘉县| 玛曲县| 济南市| 平凉市| 万安县| 连山| 东乡族自治县| 封开县| 荥阳市| 兰西县| 凌云县| 小金县| 盘锦市| 潮安县| 鄯善县| 哈尔滨市| 正安县|