亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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

快照讀和當前讀

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

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

MVCC 實現(xiàn)原理

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

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

Undo Log 鏈

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

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

Read View

Read View(讀視圖)用于管理事務之間數(shù)據(jù)可見性的一種機制。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ā)事務在查詢時就知道要讀取那些數(shù)據(jù)了。

判斷方法

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

判斷規(guī)則

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

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

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

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

小結

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

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

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

相關文章

  • SpringBoot+SseEmitter和Vue3+EventSource實現(xiàn)實時數(shù)據(jù)推送

    SpringBoot+SseEmitter和Vue3+EventSource實現(xiàn)實時數(shù)據(jù)推送

    本文主要介紹了SpringBoot+SseEmitter和Vue3+EventSource實現(xiàn)實時數(shù)據(jù)推送,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • springboot @RequestBody 接收字符串實例

    springboot @RequestBody 接收字符串實例

    這篇文章主要介紹了springboot @RequestBody 接收字符串實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java設計模式之備忘錄模式詳解

    Java設計模式之備忘錄模式詳解

    這篇文章主要介紹了Java設計模式之備忘錄模式詳解,備忘錄模式在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài)并在該對象之外保存這個狀態(tài),這樣以后就可以將該對象恢復到原先保存的狀態(tài),需要的朋友可以參考下
    2023-12-12
  • Java使用JXLS導出Excel詳解

    Java使用JXLS導出Excel詳解

    jxls是一個輕量級的Java庫,用于基于模板的Excel報表生成,這篇文章主要為大家介紹了Java如何使用JXLS導出Excel,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-11-11
  • JavaWeb實現(xiàn)表單提交的示例詳解

    JavaWeb實現(xiàn)表單提交的示例詳解

    這篇文章主要介紹了如何利用JavaWeb實現(xiàn)表單提交功能,文中的示例代碼講解詳細,對我們學習JavaWeb有一定幫助,感興趣的可以了解一下
    2022-03-03
  • Mybatis-Plus使用updateById()、update()將字段更新為null

    Mybatis-Plus使用updateById()、update()將字段更新為null

    本文主要介紹了Mybatis-Plus使用updateById()、update()將字段更新為null,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Spring注入Map集合實現(xiàn)策略模式詳解

    Spring注入Map集合實現(xiàn)策略模式詳解

    這篇文章主要介紹了Spring注入Map集合實現(xiàn)策略模式詳解,Spring提供通過@Resource注解將相同類型的對象注入到Map集合,并將對象的名字作為key,對象作為value封裝進入Map,需要的朋友可以參考下
    2023-11-11
  • MyBatisPlus PaginationInterceptor分頁插件的使用詳解

    MyBatisPlus PaginationInterceptor分頁插件的使用詳解

    這篇文章主要介紹了MyBatisPlus PaginationInterceptor分頁插件的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Java編程泛型限定代碼分享

    Java編程泛型限定代碼分享

    這篇文章主要介紹了Java編程泛型限定的相關內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot項目中訪問HTML頁面的三種方法

    SpringBoot項目中訪問HTML頁面的三種方法

    這篇文章主要介紹了SpringBoot項目中訪問HTML頁面的三種方法,文中通過代碼示例和圖文結合的方式講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07

最新評論