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

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

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

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

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

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

使用 MVCC 機制解決了 RR 隔離級別中,部分幻讀問題,但又沒把全部幻讀問題都解決。

  • MVCC 解決了 RR 隔離級別中,快照讀的幻讀問題。多次查詢快照讀時,因為 RR 級別是復用 Read View(讀視圖),所以沒有幻讀問題。
  • 但 MVCC 解決不了 RR 隔離級別中,如果遇到快照讀和當前讀(讀取當前最新的數據)中間發(fā)生過添加操作,那么 Read View 不能復用,就出現了幻讀的問題。

快照讀和當前讀

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

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

MVCC 實現原理

MVCC 主要是依靠以下兩部分實現的:

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

Undo Log 鏈

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

Undo Log 鏈是指在每個數據對象上維護的 Undo Log 記錄鏈表。每張表都會有與之相對應的 Undo Log 鏈,用于記錄修改前的數據信息(以方便數據進行回滾)。

Read View

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

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

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

RC 級別中,每次快照讀都會生成一個全新的 Read View,而 RR 級別中同一個事務會復用一個 Read View。

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

判斷方法

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

判斷規(guī)則

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

    trx_id 在 m_ids 中:說明事務尚未執(zhí)行完,該行數據不可被訪問。

    trx_id 未在 m_ids 中:說明事務已經執(zhí)行完,可以返回該行數據。

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

小結

MVCC 的實現主要依賴讀視圖 Read View 和 Undo Log 鏈,通過 Read View 中的 4 個字段,判斷要讀取 Undo Log 中數據,從而解決了數據庫并發(fā)訪問中,數據一致性的問題。

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

以上就是一文詳解MVCC的執(zhí)行原理的詳細內容,更多關于MVCC執(zhí)行原理的資料請關注腳本之家其它相關文章!

相關文章

  • 多模塊項目引入SpringSecurity后一直報404的解決方案

    多模塊項目引入SpringSecurity后一直報404的解決方案

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

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

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

    struts2通過action返回json對象

    struts2通過action返回json對象其實很簡單的,首先我們需要引入jar包,然后在寫一個簡單的action就好了,接下來通過本文給大家介紹struts2通過action返回json對象的方法,感興趣的朋友一起看看吧
    2016-09-09
  • 深入淺出探索Java分布式鎖原理

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

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

    在SpringBoot中注入RedisTemplate實例異常的解決方案

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

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

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

    java必學必會之方法的重載(overload)

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

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

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

    詳解Spring配置文件中bean的相關屬性

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

    java實現門禁系統(tǒng)

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

最新評論

隆化县| 庄浪县| 揭东县| 泽库县| 固始县| 泰和县| 稷山县| 衡东县| 娱乐| 邹平县| 濉溪县| 连江县| 台中县| 瑞安市| 忻城县| 米林县| 额济纳旗| 甘谷县| 霍山县| 政和县| 竹山县| 名山县| 扶沟县| 和政县| 和平县| 成安县| 邢台县| 湟中县| 民乐县| 灯塔市| 连城县| 禄劝| 丹寨县| 碌曲县| 资兴市| 勃利县| 乌什县| 江达县| 石狮市| 靖州| 泰州市|