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

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

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

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

MySQL 數(shù)據(jù)庫的默認隔離級別是 RR( 可重復(fù)讀 ),但是很多大公司把隔離級別改成了 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);

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

UPDATE t SET b = 5 WHERE b = 3;

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

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

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

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

UPDATE t SET b = 4 WHERE b = 2;

就會被阻塞了。

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

而執(zhí)行 SQL-A 在 RC 即讀已提交隔離級別下,會鎖哪幾條數(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)
-- 只會鎖定符合更新條件的行,即 b = 3 的行,因為RC級別不使用間隙鎖。

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

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加的鎖

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Ubuntu 18.04配置mysql以及配置遠程連接的步驟

    Ubuntu 18.04配置mysql以及配置遠程連接的步驟

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

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

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

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

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

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

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

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

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

    MySQL壓測工具mysqlslap的介紹與使用

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

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

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

    mysql建庫時提示Specified key was too long max key length is 1000

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

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

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

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

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

最新評論

茂名市| 吴川市| 泾阳县| 汉川市| 区。| 黄浦区| 永城市| 同心县| 科技| 大悟县| 马鞍山市| 株洲市| 辰溪县| 郁南县| 江北区| 昌乐县| 湖南省| 新田县| 灌云县| 香港| 岚皋县| 昌吉市| 融水| 高尔夫| 页游| 托克逊县| 辽阳县| 嘉峪关市| 英吉沙县| 鲁甸县| 农安县| 毕节市| 肇东市| 曲水县| 涞水县| 凯里市| 江华| 安乡县| 阿克苏市| 慈溪市| 拉孜县|