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

一文簡單介紹mysql的事務、鎖以及MVCC

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

四種隔離級別

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

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

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

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

MVCC

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

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

加鎖完全可以解決上面提到的臟讀、不可重復讀、幻讀的問題。就像“可序列化”隔離級別一樣,如果什么都加鎖,會導致讀寫時,必然有一方等待,降低了并發(fā)能力。所以為了提高性能,基于樂觀鎖思想,才采用了MVCC來解決問題。所以數(shù)據(jù)庫是樂觀鎖+悲觀鎖一起來使用的。
MVCC(多版本并發(fā)控制)則是通過維護數(shù)據(jù)的多個版本,讓讀操作無需等待寫操作完成,從而提高并發(fā)性能,同時保證事務隔離性。(會將每一次修改的數(shù)據(jù)用一個鏈表鏈接好,相當于歷史記錄)。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,可以提示用戶有沖突等。

快照讀/當前讀

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

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

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

鎖和MVCC對比

總結 

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

相關文章

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

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

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

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

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

    Linux(CentOS7)安裝MySQL8全過程

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

    mysql多表連接查詢實例講解

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

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

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

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

    這篇文章主要為大家詳細介紹了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安裝以及編譯安裝,這篇文章主要給大家介紹了關于如何如果通過yum方式安裝mysql數(shù)據(jù)庫的相關資料,需要的朋友可以參考下
    2024-01-01
  • MySQL外鍵級聯(lián)的實現(xiàn)

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

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

    MySQL中的全量、增量備份與恢復過程

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

最新評論

红河县| 繁峙县| 永胜县| 定陶县| 方正县| 汝阳县| 黄平县| 赤城县| 白山市| 长岛县| 潞西市| 师宗县| 建昌县| 定襄县| 高阳县| 板桥市| 盈江县| 夏河县| 彭水| 怀来县| 永和县| 游戏| 霍林郭勒市| 鄂托克旗| 虎林市| 虹口区| 凉城县| 蒲城县| 兴安县| 塔河县| 阿图什市| 都安| 余庆县| 石门县| 乡宁县| 云龙县| 虞城县| 长治县| 达孜县| 黑河市| 筠连县|