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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mvcc原理_Mysql MVCC实现原理

發布時間:2023/12/2 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mvcc原理_Mysql MVCC实现原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文中用到的概念解釋

數據讀取特性

不可重復讀

指一個事務范圍內兩個相同的查詢卻返回了不同數據

這是由于查詢時系統中其他事務修改的提交而引起的

幻讀

在兩個連續的查找之間一個并發的修改事務修改了查詢的數據集,導致這兩個查詢返回了不同的結果

這是由于查詢時系統中其他事務新增或者刪除記錄引起的

事務隔離級別

Read Commited(提交讀)

一個事務從開始到提交前,所作的任何修改對其他事務不可見

僅能讀取到已提交的記錄,這種隔離級別下,每條語句都會讀取已提交事務的更新,若兩次查詢之間有其他事務提交,則會導致兩次查詢結果不一致。

Repeatable Read(可重復讀)

在同一個事務中,多次讀取同樣的記錄的結果是一致的

快照讀與當前讀

在MVCC并發控制中,讀操作可以分成兩類,快照讀與當前讀

快照讀

讀取的是記錄數據的可見版本(可能是過期的數據),不用加鎖

簡單select使用該讀取方式

當前讀

讀取的是記錄數據的最新版本,并且當前讀返回的記錄都會加上鎖,保證其他事務不會再并發的修改這條記錄

select ... lock in share mode

select ... for update

insert

update

delete

以上查詢將使用當前讀

什么是MVCC

指多版本并發控制,讓普通的select語句直接讀取指定版本的值,避免加鎖,來提高并發請求時的性能,配合行鎖機制,在并發請求下,提高了MYSQL的性能

MVCC解決了什么問題

做到了讀不影響寫,寫不影響讀,提高了并發性能

提供了一致性讀的功能,避免幻讀和不可重復讀

什么時候會用到MVCC

在RC和RR隔離級別下,innodb通過快照讀方式讀取數據時使用

MVCC實現原理

通過保存數據在某個時間點的快照來實現,具有以下兩個特點

不管執行多長時間,同一個事務在執行的過程中看到的數據是一致的

根據事務的開始時間不同,不同事務的對同一張表,同一時刻看到的數據可能是不一樣的

MVCC具體實現

隱藏列

innodb行都設置了隱藏列(對查詢不可見),和MVCC有關的包含如下

DATA_TRX_ID: 產生這條記錄的事務ID,INSERT/UPDATE/DELETE時都會更新這個記錄

DATA_ROLL_PTR: 指向該行回滾段的指針,該行上所有舊的版本,在undo中都通過鏈表的形式組織,該值指向undo中下一個歷史記錄,歷史記錄按照由新到舊順序排列

DELETED: BIT位,刪除標志0或者1

事務鏈表(當前活躍鏈表)

MySQL中的事務在開始到提交這段過程中,都會被保存到一個叫trx_sys的全局事務鏈表中,這是一個基本的鏈表結構

事務鏈表中保存的都是還未提交的事務,事務一旦被提交,則會被從事務鏈表中摘除

ReadView

在SQL開始的時候被創建的一個數據結構,包含以下三個

low_limit_id 表示該SQL啟動時,當前事務鏈表中最大的事務id編號,也就是最近創建的除自身以外最大事務編號;

up_limit_id 表示該SQL啟動時,當前事務鏈表中最小的事務id編號,也就是當前系統中創建最早但還未提交的事務;

trx_ids 存儲當前trx_sys事務鏈表中的事務id集合。

數據讀取規則

邏輯圖

流程描述

先根據DATA_TRX_ID,ReadView 判斷記錄可見性

如果可見,根據 DELETED 判斷數據是否刪除

如果不可見,根據 DATA_ROLL_PTR 判斷是否有歷史版本,沒有則結束,如果有則取出歷史版本,重新執行這個流程,直到找到可見數據或者檢查完所有歷史版本

如何判斷可見性

DATA_TRX_ID小于up_limit_id

說明在事務開始前已經提交完成的數據,對于當前事務來說是可見的

DATA_TRX_ID大于low_limit_id

說明在查詢的時候,這條數據還沒有提交,不可見

DATA_TRX_ID位于up_limit_id和low_limit_id之間

遍歷ReadView中的trx_ids,判斷DATA_TRX_ID是否在其中

如果不在,表示事務已提交,數據可見

如果在,表示事務未提交,數據不可見

MVCC是如何解決幻讀和不可重復讀問題的

關鍵在于創建ReadView的時機

在RC隔離級別下,單個事務每次執行SELECT語句時都會創建ReadView,所以兩個相同條件的查詢可能由于隨著時間的推移,ReadView更新后可以看到更多已提交的數據,導致不可重復讀和幻讀

在RR隔離級別下,單個事務只會在第一次執行SELECT查詢時創建ReadView,后續不再更新,所以整個事務期間可以看到的數據都是相同的,不會出現不可重復讀和幻讀

總結

以上是生活随笔為你收集整理的mvcc原理_Mysql MVCC实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。