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

生產(chǎn)環(huán)境的MySQL事務(wù)隔離級(jí)別方式

 更新時(shí)間:2025年02月07日 15:49:14   作者:空說  
本文探討了MySQL數(shù)據(jù)庫(kù)在RR(可重復(fù)讀)和RC(讀已提交)隔離級(jí)別下的鎖機(jī)制,在RR級(jí)別下,UPDATE語(yǔ)句會(huì)鎖定所有符合條件的行,包括不符合條件的行,以防止幻讀,而在RC級(jí)別下,UPDATE語(yǔ)句僅鎖定符合條件的行,通過半一致性讀優(yōu)化,可以進(jìn)一步提高并發(fā)度

生產(chǎn)環(huán)境的MySQL事務(wù)隔離級(jí)別

MySQL 數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別是 RR( 可重復(fù)讀 ),但是很多大公司把隔離級(jí)別改成了 RC(讀已提交),主要原因是為了提高并發(fā)和降低死鎖概率

為了解決幻讀的問題 RR 相比 RC 多了間隙鎖( gap lock )和臨鍵鎖( next-keylock )。而 RC 中修改數(shù)據(jù)僅用行鎖,鎖定的范圍更小,因此相比而言 RC的并發(fā)更高。

創(chuàng)建如下的表,并插入一些記錄

CREATE TABLE t (a INT NOT NULL, b INT) ENGINE = InnoDB;
INSERT INTO t VALUES (1,2),(2,3),(3,2),(4,3),(5,2);

此時(shí)執(zhí)行SQL-A ,且未提交事務(wù)

UPDATE t SET b = 5 WHERE b = 3;

在 RR 即可重復(fù)隔離級(jí)別情況下,會(huì)鎖哪幾條數(shù)據(jù)呢?

答案是會(huì)鎖定所有符合條件的行,并且為了防止幻讀,還會(huì)鎖定這些行之間的間隙。

x-lock(2,3) 和 x-lock(4,3)  -- 這兩行會(huì)被更新并保留X鎖。
x-lock(1,2)、x-lock(3,2) 和 x-lock(5,2) -- 這些行雖然不符合更新條件,但由于間隙鎖的存在,它們也會(huì)被鎖定以防止其他事務(wù)插入新的行

可以看到全鎖了,此時(shí)執(zhí)行 SQL-B:

UPDATE t SET b = 4 WHERE b = 2;

就會(huì)被阻塞了。

因此,在RR隔離級(jí)別下,UPDATE t SET b = 5 WHERE b = 3; 會(huì)鎖定所有行,包括那些不符合更新條件的行。

而執(zhí)行 SQL-A 在 RC 即讀已提交隔離級(jí)別下,會(huì)鎖哪幾條數(shù)據(jù)呢?

x-lock(1,2); unlock(1,2)
x-lock(2,3); update(2,3) to (2,5); 保留 x-lock
x-lock(3,2); unlock(3,2)
x-lock(4,3); update(4,3) to (4,5); 保留 x-lock
x-lock(5,2); unlock(5,2)
-- 只會(huì)鎖定符合更新條件的行,即 b = 3 的行,因?yàn)镽C級(jí)別不使用間隙鎖。

可以看到,只鎖了兩條數(shù)據(jù),此時(shí)執(zhí)行 SQL-B 會(huì)怎樣?

x-lock(1,2); update(1,2) to (1,4); 保留 x-lock
x-lock(2,3); unlock(2,3)
x-lock(3,2); update(3,2) to (3,4); 保留 x-lock
x-lock(4,3); unlock(4,3)
x-lock(5,2); update(5,2) to (5,4); 保留 x-lock

可以看到僅鎖了 b=2 的數(shù)據(jù),完美避開了 SQL-A加的鎖

此時(shí)可能有同學(xué)會(huì)有疑問: SQL-B 不是應(yīng)該被 (2, 3 )這行的鎖給阻塞嗎?

半一致性讀(“semi-consistent”read)

這其實(shí)也是 InnoDB 做的一個(gè)優(yōu)化。

  • 在執(zhí)行 update 的時(shí)候,掃描發(fā)現(xiàn)當(dāng)前行已經(jīng)被鎖定了,它就會(huì)執(zhí)行半一致性讀的操作,得到當(dāng)前數(shù)據(jù)的最新版本(上述中 SQL-A 鎖定的行最新版本的已提交數(shù)據(jù),b都為5 ),來(lái)判斷是否和當(dāng)前的(SQL-B)update 的 where 條件匹配
  • 如果匹配則說明當(dāng)前的 update也需要鎖定這行
  • 因此需要等待。如果不匹配說明它們之間沒關(guān)聯(lián),因此不需要等待鎖,這個(gè)優(yōu)化提升了并發(fā)度。

所以 RC + 半一致性讀 能進(jìn)一步的提升 SQL 執(zhí)行的并發(fā)度。

并且 RC 鎖的粒度更小,意味著死鎖的概率會(huì)更低,但是缺點(diǎn)是可能會(huì)產(chǎn)生幻讀,這個(gè)就需要業(yè)務(wù)自已評(píng)估幻讀的問題(大部分情況下都沒啥影響)。

總結(jié)

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

相關(guān)文章

  • Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的步驟

    Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的步驟

    這篇文章主要給大家介紹了關(guān)于Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • MySQL中多表查詢的方式總結(jié)

    MySQL中多表查詢的方式總結(jié)

    本文詳細(xì)介紹了多表查詢的必要性、基礎(chǔ)前提以及核心多表查詢方式,包括JOIN連接查詢(內(nèi)連接、左外連接、右外連接、交叉連接)、子查詢和聯(lián)合查詢,每種查詢方式都有其適用場(chǎng)景和性能特點(diǎn),并提供了實(shí)際項(xiàng)目中的應(yīng)用示例和性能優(yōu)化建議,需要的朋友可以參考下
    2025-12-12
  • ERROR 1045 (28000): Access denied for user ''''root''''@''''localhost'''' (using password: YES)實(shí)用解決方案

    ERROR 1045 (28000): Access denied for user ''''root''''@''''

    這篇文章主要介紹了Linux下數(shù)據(jù)庫(kù)報(bào)ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)實(shí)用解決方案,希望能對(duì)大家有幫助。
    2017-10-10
  • MySQL如何創(chuàng)建可以遠(yuǎn)程訪問的root賬戶詳解

    MySQL如何創(chuàng)建可以遠(yuǎn)程訪問的root賬戶詳解

    作為MySQL數(shù)據(jù)庫(kù)管理員,創(chuàng)建遠(yuǎn)程用戶并設(shè)置相應(yīng)的權(quán)限是一項(xiàng)常見的任務(wù),下面這篇文章主要給大家介紹了關(guān)于MySQL如何創(chuàng)建可以遠(yuǎn)程訪問的root賬戶的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • MySQL啟動(dòng)失敗(code=exited,?status=1FAILURE)異常定位及解決方案

    MySQL啟動(dòng)失敗(code=exited,?status=1FAILURE)異常定位及解決方案

    在日常運(yùn)維和開發(fā)過程中,MySQL數(shù)據(jù)庫(kù)的穩(wěn)定運(yùn)行至關(guān)重要,然而,MySQL有時(shí)會(huì)因?yàn)榕渲梦募e(cuò)誤或環(huán)境問題而啟動(dòng)失敗,這篇文章主要介紹了MySQL啟動(dòng)失敗(code=exited,?status=1FAILURE)異常定位及解決方案的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • MySQL壓測(cè)工具mysqlslap的介紹與使用

    MySQL壓測(cè)工具mysqlslap的介紹與使用

    mysqlslap是mysql自帶的一個(gè)性能壓測(cè)工具,mysqlslap用于和其它的一些性能壓測(cè)工具一樣可以自己造數(shù)據(jù)進(jìn)行壓測(cè)。mysqlslap的報(bào)告比較簡(jiǎn)單主要體現(xiàn)在執(zhí)行的時(shí)間方面,沒有sysbench那樣的tps、qps等更詳細(xì)的包括。下面來(lái)一起看看關(guān)于mysqlslap的介紹和簡(jiǎn)單的使用示例。
    2016-09-09
  • MySQL使用聚合函數(shù)進(jìn)行單表查詢

    MySQL使用聚合函數(shù)進(jìn)行單表查詢

    這篇文章主要介紹了MySQL使用聚合函數(shù)進(jìn)行單表查詢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • mysql建庫(kù)時(shí)提示Specified key was too long max key length is 1000 bytes的問題的解決方法

    mysql建庫(kù)時(shí)提示Specified key was too long max key length is 1000

    本文將詳細(xì)提供mysql建庫(kù)時(shí)提示Specified key was too long max key length is 1000 bytes的問題的解決方法,有需求的朋友可以參考
    2012-11-11
  • mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢(shì)

    mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢(shì)

    這篇文章介紹了mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢(shì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • SQL重復(fù)記錄查詢 查詢多個(gè)字段、多表查詢、刪除重復(fù)記錄的方法

    SQL重復(fù)記錄查詢 查詢多個(gè)字段、多表查詢、刪除重復(fù)記錄的方法

    下面小編就為大家?guī)?lái)一篇SQL重復(fù)記錄查詢 查詢多個(gè)字段、多表查詢、刪除重復(fù)記錄的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2016-09-09

最新評(píng)論

越西县| 桂东县| 明水县| 沅江市| 澄迈县| 阳原县| 红安县| 前郭尔| 姜堰市| 同仁县| 杨浦区| 襄城县| 日土县| 五台县| 萍乡市| 两当县| 云龙县| 塔河县| 阿拉尔市| 五指山市| 青州市| 神农架林区| 彭水| 基隆市| 图们市| 德保县| 汽车| 大化| 武隆县| 陆川县| 孟州市| 烟台市| 新蔡县| 东阿县| 锦州市| 梅河口市| 五峰| 枞阳县| 临城县| 聂拉木县| 镶黄旗|