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

一文詳解MVCC的執(zhí)行原理

 更新時(shí)間:2023年12月29日 08:22:00   作者:Java中文社群  
MVCC是一種并發(fā)控制機(jī)制,用于解決數(shù)據(jù)庫(kù)并發(fā)訪問(wèn)中,數(shù)據(jù)一致性問(wèn)題,它通過(guò)在讀寫(xiě)操作期間保存多個(gè)數(shù)據(jù)版本,以提供并發(fā)事務(wù)間的隔離性,本文將和大家簡(jiǎn)單聊聊MVCC的執(zhí)行原理,需要的朋友可以參考下

MVCC(Multi-Version Concurrency Control)是一種并發(fā)控制機(jī)制,用于解決數(shù)據(jù)庫(kù)并發(fā)訪問(wèn)中,數(shù)據(jù)一致性問(wèn)題。它通過(guò)在讀寫(xiě)操作期間保存多個(gè)數(shù)據(jù)版本,以提供并發(fā)事務(wù)間的隔離性,從而避免了傳統(tǒng)的鎖機(jī)制所帶來(lái)的資源爭(zhēng)用和阻塞問(wèn)題。

所謂的一致性問(wèn)題,就是在并發(fā)事務(wù)執(zhí)行時(shí),應(yīng)該看到那些數(shù)據(jù)和不應(yīng)該看到那些數(shù)據(jù)。

在 MVCC 機(jī)制中,每個(gè)事務(wù)的讀操作都能看到事務(wù)開(kāi)始之前的一致性數(shù)據(jù)快照,而不受其他并發(fā)事務(wù)的修改的影響。核心思想是通過(guò)創(chuàng)建多個(gè)數(shù)據(jù)版本,保持事務(wù)的一致性和隔離性。

使用 MVCC 機(jī)制解決了 RR 隔離級(jí)別中,部分幻讀問(wèn)題,但又沒(méi)把全部幻讀問(wèn)題都解決。

  • MVCC 解決了 RR 隔離級(jí)別中,快照讀的幻讀問(wèn)題。多次查詢快照讀時(shí),因?yàn)?RR 級(jí)別是復(fù)用 Read View(讀視圖),所以沒(méi)有幻讀問(wèn)題。
  • 但 MVCC 解決不了 RR 隔離級(jí)別中,如果遇到快照讀和當(dāng)前讀(讀取當(dāng)前最新的數(shù)據(jù))中間發(fā)生過(guò)添加操作,那么 Read View 不能復(fù)用,就出現(xiàn)了幻讀的問(wèn)題。

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

快照讀:是指在一個(gè)事務(wù)中,讀取的數(shù)據(jù)版本是在事務(wù)開(kāi)始時(shí)已經(jīng)存在的數(shù)據(jù)版本,而不是最新的數(shù)據(jù)版本。這種讀取方式提供了事務(wù)在執(zhí)行期間看到的數(shù)據(jù)視圖的一致性,select 查詢就是快照讀。 當(dāng)前讀:是指在事務(wù)中讀取最新的數(shù)據(jù)版本,以下幾種操作都是快照讀:

  • select ... for update;
  • select ... lock in share mode;
  • insert ...
  • update ...
  • delete ...

MVCC 實(shí)現(xiàn)原理

MVCC 主要是依靠以下兩部分實(shí)現(xiàn)的:

  • Undo Log 鏈
  • Read View(讀視圖或者叫一致性視圖)

Undo Log 鏈

我們知道 Undo Log 主要是用于數(shù)據(jù)庫(kù)中事務(wù)回滾的,但在 MVCC 機(jī)制中也發(fā)揮著重要的作用,那什么是 Undo Log 鏈呢?

Undo Log 鏈?zhǔn)侵冈诿總€(gè)數(shù)據(jù)對(duì)象上維護(hù)的 Undo Log 記錄鏈表。每張表都會(huì)有與之相對(duì)應(yīng)的 Undo Log 鏈,用于記錄修改前的數(shù)據(jù)信息(以方便數(shù)據(jù)進(jìn)行回滾)。

Read View

Read View(讀視圖)用于管理事務(wù)之間數(shù)據(jù)可見(jiàn)性的一種機(jī)制。Read View 在特定時(shí)刻為事務(wù)創(chuàng)建的一個(gè)快照,該快照包含了在該時(shí)刻所有未提交事務(wù)的事務(wù)標(biāo)識(shí)符,以及其他一些輔助信息。

在 Read View 中包含了以下 4 個(gè)主要的字段:

  • m_ids:當(dāng)前活躍的事務(wù)編號(hào)集合。
  • min_trx_id:最小活躍事務(wù)編號(hào)。
  • max_trx_id:預(yù)分配事務(wù)編號(hào),當(dāng)前最大事務(wù)編號(hào)+1。
  • creator_trx_id:ReadView 創(chuàng)建者的事務(wù)編號(hào)。

RC 級(jí)別中,每次快照讀都會(huì)生成一個(gè)全新的 Read View,而 RR 級(jí)別中同一個(gè)事務(wù)會(huì)復(fù)用一個(gè) Read View。

有了 Read View 和 Undo Log 鏈之后,并發(fā)事務(wù)在查詢時(shí)就知道要讀取那些數(shù)據(jù)了。

判斷方法

判斷方法是根據(jù) Read View 中的 4 個(gè)重要字段,先去 Undo Log 中最新的數(shù)據(jù)行進(jìn)行比對(duì),如果滿足下面 Read View 的判斷條件,則返回當(dāng)前行的數(shù)據(jù),如果不滿足則繼續(xù)查找 Undo Log 的下一行數(shù)據(jù),直到找到滿足的條件的數(shù)據(jù)為止,如果查詢完沒(méi)有滿足條件的數(shù)據(jù),則返回 NULL。

判斷規(guī)則

  • trx_id==creator_trx_id:先將 Undo Log 最新數(shù)據(jù)行中的 trx_id 和 ReadView 中的 creator_trx_id 進(jìn)行對(duì)比,如果他們兩個(gè)值相同,則說(shuō)明是在同一個(gè)事務(wù)中執(zhí)行,那么直接返回當(dāng)前 Undo Log 的數(shù)據(jù)行即可,如果不相等,則繼續(xù)下面流程。
  • trx_id<min_trx_id:如果 trx_id 小于 min_trx_id,則說(shuō)明在執(zhí)行查詢時(shí),其他事務(wù)已經(jīng)提交此行數(shù)據(jù)了,那么直接返回此行數(shù)據(jù)即可,如果大于等于,則繼續(xù)下面流程。
  • trx_id>max_trx_id:如果 trx_id 如果大于等于 max_trx_id,則說(shuō)明該行數(shù)據(jù)比當(dāng)前操作執(zhí)行的晚,當(dāng)前行數(shù)據(jù)不可見(jiàn),繼續(xù)執(zhí)行后續(xù)流程。
  • min_trx_id<=trx_id<max_trx_id:trx_id 在 min_trx_id 和 max_trx_id 之間還分為以下兩種情況:

    trx_id 在 m_ids 中:說(shuō)明事務(wù)尚未執(zhí)行完,該行數(shù)據(jù)不可被訪問(wèn)。

    trx_id 未在 m_ids 中:說(shuō)明事務(wù)已經(jīng)執(zhí)行完,可以返回該行數(shù)據(jù)。

以上判斷規(guī)則從 Undo Log 最新的行數(shù)據(jù),逐行對(duì)比,直到找到匹配的數(shù)據(jù),否則查詢完未匹配上,則返回 NULL。

小結(jié)

MVCC 的實(shí)現(xiàn)主要依賴讀視圖 Read View 和 Undo Log 鏈,通過(guò) Read View 中的 4 個(gè)字段,判斷要讀取 Undo Log 中數(shù)據(jù),從而解決了數(shù)據(jù)庫(kù)并發(fā)訪問(wèn)中,數(shù)據(jù)一致性的問(wèn)題。

MVCC 主要應(yīng)用于 InnoDB 引擎中的 RC 事務(wù)隔離級(jí)別和 RR 隔離級(jí)別,其中 RC 隔離級(jí)別每次快照讀都會(huì)生成一個(gè)新的 Read View,而 RR 隔離級(jí)別只在第一次快照讀時(shí)生成 Read View,之后會(huì)復(fù)用 Read View,從而解決了(部分)幻讀問(wèn)題。

以上就是一文詳解MVCC的執(zhí)行原理的詳細(xì)內(nèi)容,更多關(guān)于MVCC執(zhí)行原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 多模塊項(xiàng)目引入SpringSecurity后一直報(bào)404的解決方案

    多模塊項(xiàng)目引入SpringSecurity后一直報(bào)404的解決方案

    這篇文章主要介紹了多模塊項(xiàng)目引入SpringSecurity后一直報(bào)404的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java為實(shí)體類動(dòng)態(tài)添加屬性的方法詳解

    Java為實(shí)體類動(dòng)態(tài)添加屬性的方法詳解

    這篇文章主要介紹了Java如何給已有實(shí)體類動(dòng)態(tài)的添加字段并返回新的實(shí)體對(duì)象且不影響原來(lái)的實(shí)體對(duì)象結(jié)構(gòu)。文中的方法講解詳細(xì),需要的可以參考一下
    2022-06-06
  • struts2通過(guò)action返回json對(duì)象

    struts2通過(guò)action返回json對(duì)象

    struts2通過(guò)action返回json對(duì)象其實(shí)很簡(jiǎn)單的,首先我們需要引入jar包,然后在寫(xiě)一個(gè)簡(jiǎn)單的action就好了,接下來(lái)通過(guò)本文給大家介紹struts2通過(guò)action返回json對(duì)象的方法,感興趣的朋友一起看看吧
    2016-09-09
  • 深入淺出探索Java分布式鎖原理

    深入淺出探索Java分布式鎖原理

    單體系統(tǒng)中,在高并發(fā)場(chǎng)景下想要訪問(wèn)共享資源的時(shí)候,我們需要通過(guò)加鎖的方式來(lái)保證共享資源并發(fā)的安全性,確保在同一時(shí)刻只有一個(gè)線程對(duì)共享資源進(jìn)行操作
    2022-02-02
  • 在SpringBoot中注入RedisTemplate實(shí)例異常的解決方案

    在SpringBoot中注入RedisTemplate實(shí)例異常的解決方案

    這篇文章主要介紹了在SpringBoot中注入RedisTemplate實(shí)例異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java8中用foreach循環(huán)獲取對(duì)象的index下標(biāo)詳解

    Java8中用foreach循環(huán)獲取對(duì)象的index下標(biāo)詳解

    這篇文章主要給大家介紹了關(guān)于Java8中用foreach循環(huán)獲取對(duì)象的index下標(biāo)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java必學(xué)必會(huì)之方法的重載(overload)

    java必學(xué)必會(huì)之方法的重載(overload)

    java必學(xué)必會(huì)之方法的重載,介紹了方法的重載、構(gòu)造方法的重載,想要學(xué)好java方法的重載的朋友一定要好好閱讀這篇文章
    2015-12-12
  • 一文了解jJava中的加密與安全

    一文了解jJava中的加密與安全

    常見(jiàn)的編碼有ASCII碼、Unicode編碼。最簡(jiǎn)單的編碼是直接給每個(gè)字符指定一個(gè)若干字節(jié)表示的整數(shù),復(fù)雜一點(diǎn)的編碼就需要根據(jù)已有的編碼推算出來(lái)。本文將為大家詳細(xì)講講Java重點(diǎn)加密與安全,感興趣的可以了解一下
    2022-07-07
  • 詳解Spring配置文件中bean的相關(guān)屬性

    詳解Spring配置文件中bean的相關(guān)屬性

    這篇文章主要為大家詳細(xì)介紹了Spring配置文件中bean的相關(guān)屬性的知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • java實(shí)現(xiàn)門禁系統(tǒng)

    java實(shí)現(xiàn)門禁系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)門禁系統(tǒng)的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評(píng)論

舟山市| 西和县| 清河县| 资兴市| 阳城县| 阜南县| 玉林市| 石嘴山市| 泉州市| 娄底市| 醴陵市| 城口县| 大理市| 遂溪县| 渑池县| 仙游县| 阜宁县| 棋牌| 敦煌市| 莎车县| 山阳县| 岳阳县| 嘉荫县| 忻州市| 小金县| 清远市| 栾川县| 望奎县| 海晏县| 云浮市| 乌拉特后旗| 西贡区| 明光市| 张家口市| 法库县| 潞西市| 新昌县| 墨江| 唐河县| 青海省| 卫辉市|