日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

数据库的事务隔离技术 之 MVCC

發(fā)布時(shí)間:2025/3/21 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库的事务隔离技术 之 MVCC 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在mysql中,提供了兩種事務(wù)隔離技術(shù),第一個(gè)是mvcc,第二個(gè)是next-key技術(shù)。

這個(gè)在使用不同的語(yǔ)句的時(shí)候可以動(dòng)態(tài)選擇。不加lock in share mode之類的就使用mvcc。否則使用next-key。

mvcc的優(yōu)勢(shì)是不加鎖,并發(fā)性高。缺點(diǎn)是不是實(shí)時(shí)數(shù)據(jù)。next-key的優(yōu)勢(shì)是獲取實(shí)時(shí)數(shù)據(jù),但是需要加鎖。

同時(shí)需要注意幾點(diǎn):

1.事務(wù)的快照時(shí)間點(diǎn)是以第一個(gè)select來(lái)確認(rèn)的。所以即便事務(wù)先開始。但是select在后面的事務(wù)的update之類的語(yǔ)句后進(jìn)行,那么它是可以獲取后面的事務(wù)的對(duì)應(yīng)的數(shù)據(jù)。

2.mysql中數(shù)據(jù)的存放還是會(huì)通過(guò)版本記錄一系列的歷史數(shù)據(jù),這樣,可以根據(jù)版本查找數(shù)據(jù)。


?本片博文先講解MVCC技術(shù),下一篇博文講解next-key技術(shù)


?

多版本并發(fā)控制(Multi-Version Concurrency Control, MVCC)是 MySQL 的 InnoDB 存儲(chǔ)引擎實(shí)現(xiàn)隔離級(jí)別的一種具體方式,用于實(shí)現(xiàn)提交讀和可重復(fù)讀這兩種隔離級(jí)別。而未提交讀隔離級(jí)別總是讀取最新的數(shù)據(jù)行,無(wú)需使用 MVCC。可串行化隔離級(jí)別需要對(duì)所有讀取的行都加鎖,單純使用 MVCC 無(wú)法實(shí)現(xiàn)。

版本號(hào)

  • 系統(tǒng)版本號(hào):是一個(gè)遞增的數(shù)字,每開始一個(gè)新的事務(wù),系統(tǒng)版本號(hào)就會(huì)自動(dòng)遞增。
  • 事務(wù)版本號(hào):事務(wù)開始時(shí)的系統(tǒng)版本號(hào)。

隱藏的列

MVCC 在每行記錄后面都保存著兩個(gè)隱藏的列,用來(lái)存儲(chǔ)兩個(gè)版本號(hào):

  • 創(chuàng)建版本號(hào):指示創(chuàng)建一個(gè)數(shù)據(jù)行的快照時(shí)的系統(tǒng)版本號(hào);
  • 刪除版本號(hào):如果該快照的刪除版本號(hào)大于當(dāng)前事務(wù)版本號(hào)表示該快照有效,否則表示該快照已經(jīng)被刪除了。

Undo 日志

MVCC 使用到的快照存儲(chǔ)在 Undo 日志中,該日志通過(guò)回滾指針把一個(gè)數(shù)據(jù)行(Record)的所有快照連接起來(lái)。

?

實(shí)現(xiàn)過(guò)程

以下實(shí)現(xiàn)過(guò)程針對(duì)可重復(fù)讀隔離級(jí)別。

當(dāng)開始新一個(gè)事務(wù)時(shí),該事務(wù)的版本號(hào)肯定會(huì)大于當(dāng)前所有數(shù)據(jù)行快照的創(chuàng)建版本號(hào),理解這一點(diǎn)很關(guān)鍵。

1. SELECT

多個(gè)事務(wù)必須讀取到同一個(gè)數(shù)據(jù)行的快照,并且這個(gè)快照是距離現(xiàn)在最近的一個(gè)有效快照。但是也有例外,如果有一個(gè)事務(wù)正在修改該數(shù)據(jù)行,那么它可以讀取事務(wù)本身所做的修改,而不用和其它事務(wù)的讀取結(jié)果一致。

把沒(méi)有對(duì)一個(gè)數(shù)據(jù)行做修改的事務(wù)稱為 T,T 所要讀取的數(shù)據(jù)行快照的創(chuàng)建版本號(hào)必須小于 T 的版本號(hào),因?yàn)槿绻笥诨蛘叩扔?T 的版本號(hào),那么表示該數(shù)據(jù)行快照是其它事務(wù)的最新修改,因此不能去讀取它。除此之外,T 所要讀取的數(shù)據(jù)行快照的刪除版本號(hào)必須大于 T 的版本號(hào),因?yàn)槿绻∮诘扔?T 的版本號(hào),那么表示該數(shù)據(jù)行快照是已經(jīng)被刪除的,不應(yīng)該去讀取它。

2. INSERT

將當(dāng)前系統(tǒng)版本號(hào)作為數(shù)據(jù)行快照的創(chuàng)建版本號(hào)。

3. DELETE

將當(dāng)前系統(tǒng)版本號(hào)作為數(shù)據(jù)行快照的刪除版本號(hào)。

4. UPDATE

將當(dāng)前系統(tǒng)版本號(hào)作為更新前的數(shù)據(jù)行快照的刪除版本號(hào),并將當(dāng)前系統(tǒng)版本號(hào)作為更新后的數(shù)據(jù)行快照的創(chuàng)建版本號(hào)。可以理解為先執(zhí)行 DELETE 后執(zhí)行 INSERT。


?

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

1. 快照讀

使用 MVCC 讀取的是快照中的數(shù)據(jù),這樣可以減少加鎖所帶來(lái)的開銷。

select * from table ...;

2. 當(dāng)前讀

讀取的是最新的數(shù)據(jù),需要加鎖。以下第一個(gè)語(yǔ)句需要加 S 鎖,其它都需要加 X 鎖。

select * from table where ? lock in share mode; select * from table where ? for update; insert; update; delete;

?

快照讀

??讀取的是記錄數(shù)據(jù)的可見(jiàn)版本(可能是過(guò)期的數(shù)據(jù)),不用加鎖

當(dāng)前讀

??讀取的是記錄數(shù)據(jù)的最新版本,并且當(dāng)前讀返回的記錄都會(huì)加上鎖,保證其他事務(wù)不會(huì)再并發(fā)的修改這條記錄
??概念說(shuō)的比較虛,也不好理解,接著舉一個(gè)例子吧,假設(shè)你開啟了兩個(gè)事務(wù),分別是A和B,這里有個(gè)張表,user表,里面有四條數(shù)據(jù)

?

1、insert 快照讀(照片)

??當(dāng)你執(zhí)行select *之后,在A與B事務(wù)中都會(huì)返回4條一樣的數(shù)據(jù),這是不用想的,當(dāng)執(zhí)行select的時(shí)候,innodb默認(rèn)會(huì)執(zhí)行快照讀,相當(dāng)于就是給你目前的狀態(tài)拍了一張照片,以后執(zhí)行select 的時(shí)候就會(huì)返回當(dāng)前照片里面的數(shù)據(jù),當(dāng)其他事務(wù)提交了也對(duì)你不造成影響,和你沒(méi)關(guān)系,這就實(shí)現(xiàn)了可重復(fù)讀了,那這個(gè)照片是什么時(shí)候生成的呢?不是開啟事務(wù)的時(shí)候,是當(dāng)你第一次執(zhí)行select的時(shí)候,也就是說(shuō),當(dāng)A開啟了事務(wù),然后沒(méi)有執(zhí)行任何操作,這時(shí)候B insert了一條數(shù)據(jù)然后commit,這時(shí)候A執(zhí)行 select,那么返回的數(shù)據(jù)中就會(huì)有B添加的那條數(shù)據(jù)......之后無(wú)論再有其他事務(wù)commit都沒(méi)有關(guān)系,因?yàn)檎掌呀?jīng)生成了,而且不會(huì)再生成了,以后都會(huì)參考這張照片。(這就是為什么數(shù)據(jù)可能是過(guò)期數(shù)據(jù)的原因)

2、update、insert、delete 當(dāng)前讀

??當(dāng)你執(zhí)行這幾個(gè)操作的時(shí)候默認(rèn)會(huì)執(zhí)行當(dāng)前讀,也就是會(huì)讀取最新的記錄,也就是別的事務(wù)提交的數(shù)據(jù)你也可以看到,這樣很好理解啊,假設(shè)你要update一個(gè)記錄,另一個(gè)事務(wù)已經(jīng)delete這條數(shù)據(jù)并且commit了,這樣不是會(huì)產(chǎn)生沖突嗎,所以你update的時(shí)候肯定要知道最新的信息啊。

??我在這里介紹一下update的過(guò)程吧,首先會(huì)執(zhí)行當(dāng)前讀,然后把返回的數(shù)據(jù)加鎖,之后執(zhí)行update,然后把鎖釋放掉。加鎖是防止別的事務(wù)在這個(gè)時(shí)候?qū)@條記錄做什么,默認(rèn)加的是排他鎖,也就是你讀都不可以,這樣就可以保證數(shù)據(jù)不會(huì)出錯(cuò)了。

總結(jié)

以上是生活随笔為你收集整理的数据库的事务隔离技术 之 MVCC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品人妻无码专区视频 | 97精品久久久 | jzzijzzij亚洲成熟少妇在线观看 久久久精品人妻一区二区三区 | 久久国产欧美 | www.69视频 | 亚洲国产精品99久久 | 中文字幕高清在线播放 | 天天操夜夜操狠狠操 | 久久妇女| 久久一区二区三区精品 | 99久久免费看精品国产一区 | 黑人巨大猛烈捣出白浆 | 熟妇的味道hd中文字幕 | 波多野结衣视频播放 | 欧美福利一区二区 | 我爱av好色| 亚洲欧美一区二区三区不卡 | 色人阁五月 | 麻豆av免费在线 | 日本国产在线 | 粗大的内捧猛烈进出视频 | 国产性猛交xxxⅹ交酡全过程 | 狠狠婷| 老司机深夜福利影院 | 国产欧美专区 | 免费成人深夜小野草 | 中文字幕人妻互换av久久 | 久久精品国产亚洲AV成人雅虎 | 欧美男人的天堂 | 内射国产内射夫妻免费频道 | 亚洲 另类 春色 国产 | 兔费看少妇性l交大片免费 日韩高清不卡 | 日韩av中文字幕在线 | 亚洲欧美视频一区二区 | 91在线免费播放 | 极品久久久久 | 岳乳丰满一区二区三区 | 国产女主播视频 | 亚洲一区色 | 四虎影院在线看 | 亚洲欧美视频一区 | 99国产精品99久久久久久 | 人人射人人爱 | 91爱在线观看 | 青草视频在线观看免费 | 黄色一级片免费在线观看 | 在线免费看毛片 | 国产传媒专区 | 毛片毛片毛片毛片毛片毛片 | 老熟女高潮喷水了 | 成人18视频| 又大又粗欧美黑人aaaaa片 | 中文字幕高清在线播放 | 精品一区二区av | 97青青草 | 午夜精品成人毛片非洲 | 成人在线观看免费高清 | 亚洲无码精品国产 | 99在线国产| 91精品国产欧美一区二区成人 | 波多在线视频 | 国产女人和拘做受视频免费 | 亚洲日本一区二区 | 国产精品香蕉国产 | 牛牛精品视频 | 青青草激情 | 一级毛片黄片 | 永久免费AV无码网站韩国毛片 | 高潮久久久 | 免费爱爱视频网站 | 欧美黑人精品 | 日本美女一级片 | 欧美精品1区 | 亚洲精品一区二区三区影院忠贞 | 国产精品88久久久久久妇女 | 1级片在线观看 | avtt中文字幕 | 懂色av一区二区三区四区五区 | 欧美视频一区二区三区在线观看 | 日韩精品无码一本二本三本色 | 欧美成人一区二区三区片免费 | jizz中国少妇 | 肉感丰满的av演员 | 天天干人人 | 视频一区二区欧美 | 色妻av| 国产99久久久国产精品成人免费 | 日本在线视频播放 | 韩日视频 | 人妻熟女aⅴ一区二区三区汇编 | 性感美女在线 | 老鸭窝久久 | 国产人妻久久精品一区二区三区 | 午夜福利毛片 | 五月激情六月 | 精品国产一区二区三区久久久蜜臀 | 国产又粗又猛又爽又黄91 | 黄色三级网络 | 特黄三级又爽又粗又大 |