大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 淺談MySQL中的MVCC

淺談MySQL中的MVCC

更新時間:2021-01-20 17:08:00 來源:動力節(jié)點 瀏覽1441次

MVCC(multiversion concurrency control),多版本并發(fā)控制,在MySQL數(shù)據(jù)庫中主要是通過在每一行記錄中增加三個字段,與undo log 中相關(guān)記錄配合使用,同時加上可見性算法,使得各個事務(wù)可以在不加鎖的情況下能夠同時地讀取到某行記錄上的準確值(這個值對不同的事務(wù)而言可能是不同的)。使用MVCC,在不加鎖的情況下也能讀取到準確的數(shù)據(jù),大大提高了并發(fā)效率。本文我們就來講MySQL中的MVCC

 

那么為什么需要MVCC呢?數(shù)據(jù)庫通常使用鎖來實現(xiàn)隔離性。最原生的鎖,鎖住一個資源后會禁止其他任何線程訪問同一個資源。但是很多應(yīng)用的一個特點都是讀多寫少的場景,很多數(shù)據(jù)的讀取次數(shù)遠大于修改的次數(shù),而讀取數(shù)據(jù)間互相排斥顯得不是很必要。所以就使用了一種讀寫鎖的方法,讀鎖和讀鎖之間不互斥,而寫鎖和寫鎖、讀鎖都互斥。這樣就很大提升了系統(tǒng)的并發(fā)能力。之后人們發(fā)現(xiàn)并發(fā)讀還是不夠,又提出了能不能讓讀寫之間也不沖突的方法,就是讀取數(shù)據(jù)時通過一種類似快照的方式將數(shù)據(jù)保存下來,這樣讀鎖就和寫鎖不沖突了,不同的事務(wù)session會看到自己特定版本的數(shù)據(jù)。當然快照是一種概念模型,不同的數(shù)據(jù)庫可能用不同的方式來實現(xiàn)這種功能。

 

舉個例子,程序員A正在讀數(shù)據(jù)庫中某些內(nèi)容,而程序員B正在給這些內(nèi)容做修改(假設(shè)是在一個事務(wù)內(nèi)修改,大概持續(xù)10s左右),A在這10s內(nèi) 則可能看到一個不一致的數(shù)據(jù),在B沒有提交前,如何讓A能夠一直讀到的數(shù)據(jù)都是一致的呢?

 

有幾種處理方法,第一種: 基于鎖的并發(fā)控制,程序員B開始修改數(shù)據(jù)時,給這些數(shù)據(jù)加上鎖,程序員A這時再讀,就發(fā)現(xiàn)讀取不了,處于等待情況,只能等B操作完才能讀數(shù)據(jù),這保證A不會讀到一個不一致的數(shù)據(jù),但是這個會影響程序的運行效率。還有一種就是:MVCC,每個用戶連接數(shù)據(jù)庫時,看到的都是某一特定時刻的數(shù)據(jù)庫快照,在B的事務(wù)沒有提交之前,A始終讀到的是某一特定時刻的數(shù)據(jù)庫快照,不會讀到B事務(wù)中的數(shù)據(jù)修改情況,直到B事務(wù)提交,才會讀取B的修改內(nèi)容。

      

一個支持MVCC的數(shù)據(jù)庫,在更新某些數(shù)據(jù)時,并非使用新數(shù)據(jù)覆蓋舊數(shù)據(jù),而是標記舊數(shù)據(jù)是過時的,同時在其他地方新增一個數(shù)據(jù)版本。因此,同一份數(shù)據(jù)有多個版本存儲,但只有一個是最新的。

 

MVCC提供了時間一致性的處理思路,在MVCC下讀事務(wù)時,通常使用一個時間戳或者事務(wù)ID來確定訪問哪個狀態(tài)的數(shù)據(jù)庫及哪些版本的數(shù)據(jù)。讀事務(wù)跟寫事務(wù)彼此是隔離開來的,彼此之間不會影響。假設(shè)同一份數(shù)據(jù),既有讀事務(wù)訪問,又有寫事務(wù)操作,實際上,寫事務(wù)會新建一個新的數(shù)據(jù)版本,而讀事務(wù)訪問的是舊的數(shù)據(jù)版本,直到寫事務(wù)提交,讀事務(wù)才會訪問到這個新的數(shù)據(jù)版本。

 

MVCC有兩種實現(xiàn)方式,第一種實現(xiàn)方式是將數(shù)據(jù)記錄的多個版本保存在數(shù)據(jù)庫中,當這些不同版本數(shù)據(jù)不再需要時,垃圾收集器回收這些記錄。這個方式被PostgreSQL和Firebird/Interbase采用,SQL Server使用的類似機制,所不同的是舊版本數(shù)據(jù)不是保存在數(shù)據(jù)庫中,而保存在不同于主數(shù)據(jù)庫的另外一個數(shù)據(jù)庫tempdb中。

 

第二種實現(xiàn)方式只在數(shù)據(jù)庫保存最新版本的數(shù)據(jù),但是會在使用undo時動態(tài)重構(gòu)舊版本數(shù)據(jù),這種方式被Oracle和MySQL/InnoDB使用。

 

MVCC只在 READ COMMITTED 和 REPEATABLE READ 兩個隔離級別下工作。其他兩個隔離級別夠和MVCC不兼容, 因為 READ UNCOMMITTED 總是讀取最新的數(shù)據(jù)行, 而不是符合當前事務(wù)版本的數(shù)據(jù)行。而 SERIALIZABLE 則會對所有讀取的行都加鎖。如果你是可重復讀隔離級別REPEATABLE_READ,這時候你的ReadView還是第一次select時候生成的ReadView,也就是列表的值還是[100]。所以select的結(jié)果是強哥1。所以第二次select結(jié)果和第一次一樣,所以叫可重復讀!也就是說已提交讀隔離級別下的事務(wù)在每次查詢的開始都會生成一個獨立的ReadView,而可重復讀隔離級別則在第一次讀的時候生成一個ReadView,之后的讀都復用之前的ReadView。

 

以上就是MySQL中的MVCC,通過版本鏈,實現(xiàn)多版本,可并發(fā)讀-寫,寫-讀。通過ReadView生成策略的不同實現(xiàn)不同的隔離級別。這也是MySQL數(shù)據(jù)庫中非常重要的幾個機制之一,想要了解更多MySQL數(shù)據(jù)庫中的機制,請觀看本站的MySQL教程,名師為你講解最新最全的MySQL數(shù)據(jù)庫知識!

 

 

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 青青青视频自偷自拍视频1 青青青手机版视频在线观看 | 亚欧aⅴ天堂在线 | 国产美女免费观看 | 婷婷亚洲五月 | 欧美一级毛片欧美毛片视频 | 两性视频久久 | 天天搞天天搞 | 欧美激情精品久久久久久久久久 | 国产婷婷色一区二区三区 | 久久红综合久久亚洲网色 | 中文字幕福利视频 | 99亚洲视频| 欧美精品在欧美一区二区 | 成人免费aa在线观看 | se在线观看 | 九九免费精品视频在这里 | 欧美日韩国产超高清免费看片 | 一级毛片免费观看久 | 久久99热这里只有精品高清 | www午夜视频 | 久久国产精品自由自在 | 香蕉视频国产在线观看 | 亚洲一区二区三区高清网 | 成人亚洲在线观看 | 精品日韩二区三区精品视频 | 国产a级高清版毛片 | 欧美 日产 国产精选 | 朴妮唛禁福利视频在线 | 狠狠操大逼 | 日本精品中文字幕在线不卡 | 亚洲精品另类 | 天天做天天爱夜夜想毛片 | 亚洲女精品一区二区三区 | 国产亚洲精品2021自在线 | 精品毛片视频 | 欧美日本一级在线播放 | 91精品国产色综合久久不 | 福利视频网页 | 国产成人a v在线影院 | 色在线网站 | 亚洲一区视频在线播放 |