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

一文簡單介紹mysql的事務(wù)、鎖以及MVCC

 更新時間:2025年12月22日 12:00:37   作者:WKP9418  
在MySQL的InnoDB存儲引擎中,鎖是用于管理并發(fā)訪問的一種機(jī)制,MVCC的核心思想是通過維護(hù)數(shù)據(jù)的多個版本來實(shí)現(xiàn)并發(fā)控制,這篇文章主要介紹了mysql事務(wù)、鎖以及MVCC的相關(guān)資料,需要的朋友可以參考下

四種隔離級別

一般默認(rèn)是RR,即可重復(fù)讀。如果是互聯(lián)網(wǎng)公司,為了避免鎖等待,一般是RC。

  1. 讀未提交(Read Uncommitted)
    會導(dǎo)致臟讀。讀到了其他事務(wù)還沒提交的數(shù)

  2. 讀已提交RC(Read Committed)
    一個事務(wù)只能讀取到其他事務(wù)已經(jīng)提交的更改。
    會導(dǎo)致不可重讀:由于另一個事務(wù)提交的影響,導(dǎo)致兩次讀取的結(jié)果不一樣。

  3. 可重復(fù)讀RR(Repeatable Read)
    默認(rèn)的隔離級別。在這個級別下,保證在同一個事務(wù)內(nèi),多次讀取同一數(shù)據(jù)的結(jié)果是一致的。
    但是會有幻讀問題,幻讀是一種特殊的不可重復(fù)讀。為啥說是特殊的不可重復(fù)讀呢?因?yàn)榛米x是范圍性的不可重復(fù)讀。事務(wù)A執(zhí)行select …where前后,如果其他事務(wù)執(zhí)行insert語句插入了滿足where條件的記錄,那么事務(wù)A的兩次查詢結(jié)果會不一樣。
    需要注意的是,mysql添加了next-key臨鍵鎖(行鎖+間隙鎖)來解決了幻讀。
    4.可序列化
    讀加共享鎖,寫加排他鎖,讀寫互斥。使用的悲觀鎖的理論,實(shí)現(xiàn)簡單,數(shù)據(jù)更加安全,但是并發(fā)能力非常差。如果你的業(yè)務(wù)并發(fā)的特別少或者沒有并發(fā),同時又要求數(shù)據(jù)及時可靠的話,可以使用這種模式。

MVCC

明確一點(diǎn),鎖、MVCC這些東西都是為了保證ACID的。

鎖機(jī)制是通過鎖定資源(如表、行)來防止并發(fā)操作之間的沖突,確保數(shù)據(jù)一致性。

加鎖完全可以解決上面提到的臟讀、不可重復(fù)讀、幻讀的問題。就像“可序列化”隔離級別一樣,如果什么都加鎖,會導(dǎo)致讀寫時,必然有一方等待,降低了并發(fā)能力。所以為了提高性能,基于樂觀鎖思想,才采用了MVCC來解決問題。所以數(shù)據(jù)庫是樂觀鎖+悲觀鎖一起來使用的。
MVCC(多版本并發(fā)控制)則是通過維護(hù)數(shù)據(jù)的多個版本,讓讀操作無需等待寫操作完成,從而提高并發(fā)性能,同時保證事務(wù)隔離性。(會將每一次修改的數(shù)據(jù)用一個鏈表鏈接好,相當(dāng)于歷史記錄)。mysql 數(shù)據(jù)庫中,每一條數(shù)據(jù)都保存一個創(chuàng)建時的版本號和一個刪除版本號,MVCC就是根據(jù)這兩個來發(fā)揮作用的。

多版本并發(fā)控制的一個簡單使用就是,查詢時select version,xxx,xx where id = 1讀出來,此時version=1。修改數(shù)據(jù)時版本號+1,update xx ... where id = 1 and version =2,如果返回1說明修改成功,如果返回0,可以提示用戶有沖突等。

快照讀/當(dāng)前讀

  • 快照讀:讀取的是歷史數(shù)據(jù),非最新的數(shù)據(jù)
  • 當(dāng)前讀 :讀取最新數(shù)據(jù)
  • 快照讀:就是select
    select * from table ….;
  • 當(dāng)前讀:特殊的讀操作,插入/更新/刪除操作,屬于當(dāng)前讀,處理的都是當(dāng)前的數(shù)據(jù),需要加鎖。
     
    select * from table where ? lock in share mode;
    select * from table where ? for update;
    insert;
    update ;
    delete;

MVCC:解決了讀操作時的不可重復(fù)讀和幻讀
臨鍵鎖:解決了寫操作時的幻讀(當(dāng)前讀、更新、刪除)。
為啥這么說呢?
看下,在RR隔離級別下,如何解決不可重復(fù)讀、幻讀呢?可重復(fù)讀其實(shí)讀到的是歷史數(shù)據(jù),這叫快照讀。只會讀取歷史數(shù)據(jù),不用加鎖。其他事務(wù)此時insert或update或delete的話,他們的創(chuàng)建版本號或者刪除版本號會改變。此時insert的話,假如創(chuàng)建版本號是10。而另一個RR事務(wù)版本號是5。MVCC規(guī)定,事務(wù)版本號是5的話,select的時候,只能查到 創(chuàng)建版本號<=5的數(shù)據(jù)。所以不會查到創(chuàng)建版本號是10的數(shù)據(jù)。其實(shí)這也解決了幻讀。從這里可以看出,MVCC只能解決快照讀場景下面的幻讀,不能解決當(dāng)前讀場景下的幻讀。舉個例子:
·SELECT … FOR UPDATE·,這是當(dāng)前讀,直接加鎖需要讀取最新的數(shù)據(jù),那么MVCC就沒啥用了。此時再插入一行新記錄,那么select也會查出該條記錄來。所以該場景下出現(xiàn)了臨鍵鎖。

注意臨鍵鎖是加在索引上面的,如果沒有索引,可能會鎖全表。

鎖和MVCC對比

總結(jié) 

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

相關(guān)文章

  • MySql完整卸載的四個步驟詳解

    MySql完整卸載的四個步驟詳解

    有時候MySQL不能完全卸載,這時候必須通過一些途徑刪除掉注冊表和一些殘余的文件,然后才能重新安裝才可以成功,下面這篇文章主要給大家介紹了關(guān)于MySql完整卸載的四個步驟,需要的朋友可以參考下
    2022-06-06
  • MySQL頻繁更新熱點(diǎn)數(shù)據(jù)高并發(fā)場景下的具體解決方案

    MySQL頻繁更新熱點(diǎn)數(shù)據(jù)高并發(fā)場景下的具體解決方案

    本文詳細(xì)介紹了MySQL高頻更新熱點(diǎn)數(shù)據(jù)在高并發(fā)場景下的解決方案,包括應(yīng)用層緩存、數(shù)據(jù)分片、隊(duì)列削峰、數(shù)據(jù)庫層面優(yōu)化(如CAS、調(diào)整事務(wù)隔離級別)、讀寫分離、請求合并、參數(shù)調(diào)優(yōu)、分布式計數(shù)器等方法,需要的朋友可以參考下
    2025-10-10
  • Linux(CentOS7)安裝MySQL8全過程

    Linux(CentOS7)安裝MySQL8全過程

    這篇文章主要介紹了Linux(CentOS7)安裝MySQL8全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • mysql多表連接查詢實(shí)例講解

    mysql多表連接查詢實(shí)例講解

    本篇文章中給大家通過實(shí)例代碼講述了mysql多表連接查詢的方法,有需要的朋友們可以參考學(xué)習(xí)下。
    2018-10-10
  • MySQL中主鍵為0與主鍵自排約束的關(guān)系詳解(細(xì)節(jié))

    MySQL中主鍵為0與主鍵自排約束的關(guān)系詳解(細(xì)節(jié))

    這篇文章主要給大家介紹了關(guān)于MySQL中主鍵為0與主鍵自排約束的關(guān)系的相關(guān)資料,主要介紹的是其中的一些非常細(xì)的細(xì)節(jié),對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • mysql出現(xiàn)ERROR 1819 (HY000)的解決方法

    mysql出現(xiàn)ERROR 1819 (HY000)的解決方法

    這篇文章主要為大家詳細(xì)介紹了mysql出現(xiàn)ERROR 1819 (HY000)的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • MySQL?數(shù)據(jù)庫聚合查詢和聯(lián)合查詢操作

    MySQL?數(shù)據(jù)庫聚合查詢和聯(lián)合查詢操作

    這篇文章主要介紹了MySQL?數(shù)據(jù)庫聚合查詢和聯(lián)合查詢操作,需要的朋友可以參考下
    2021-12-12
  • 如何通過yum方式安裝mysql數(shù)據(jù)庫

    如何通過yum方式安裝mysql數(shù)據(jù)庫

    部署MySQL數(shù)據(jù)庫有多種部署方式,常用的部署方式就有三種,yum安裝、rpm安裝以及編譯安裝,這篇文章主要給大家介紹了關(guān)于如何如果通過yum方式安裝mysql數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • MySQL外鍵級聯(lián)的實(shí)現(xiàn)

    MySQL外鍵級聯(lián)的實(shí)現(xiàn)

    本文主要介紹了MySQL外鍵級聯(lián)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • MySQL中的全量、增量備份與恢復(fù)過程

    MySQL中的全量、增量備份與恢復(fù)過程

    這篇文章主要介紹了MySQL中的全量、增量備份與恢復(fù)過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06

最新評論

民丰县| 通海县| 古丈县| 修水县| 鸡泽县| 顺昌县| 邛崃市| 旅游| 诏安县| 蓬安县| 东乡| 云阳县| 正宁县| 南平市| 禹州市| 久治县| 楚雄市| 习水县| 额敏县| 海阳市| 浦东新区| 沿河| 济南市| 普陀区| 马边| 富顺县| 宁阳县| 安宁市| 宁明县| 错那县| 滨海县| 吉林市| 西畴县| 新余市| 昂仁县| 盖州市| 大新县| 葫芦岛市| 行唐县| 仪征市| 桐柏县|