国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Mysql隔離性之Read View的用法說明

瀏覽:55日期:2023-10-04 15:12:24
當(dāng)前事務(wù)能讀取到哪個歷史版本?

Read View是事務(wù)開啟時,當(dāng)前所有事務(wù)的一個集合,這個數(shù)據(jù)結(jié)構(gòu)中存儲了當(dāng)前Read View中最大的ID及最小的ID。

這就是當(dāng)前活躍事務(wù)列表,如下所示:

ct-trx --> trx11 --> trx9 --> trx6 --> trx5 --> trx3;

ct-trx 表示當(dāng)前事務(wù)的id,對應(yīng)上面的read_view數(shù)據(jù)結(jié)構(gòu)如下,

read_view->creator_trx_id = ct-trx;read_view->up_limit_id = trx3; 低水位read_view->low_limit_id = trx11; 高水位read_view->trx_ids = [trx11, trx9, trx6, trx5, trx3];

low_limit_id是“高水位”,即當(dāng)時活躍事務(wù)的最大id,如果讀到row的db_trx_id>=low_limit_id,說明這些id在此之前的數(shù)據(jù)都沒有提交,如注釋中的描述,這些數(shù)據(jù)都不可見。

if (trx_id >= view->low_limit_id) {return(FALSE);}

注:readview 部分源碼

up_limit_id是“低水位”,即當(dāng)時活躍事務(wù)列表的最小事務(wù)id,如果row的db_trx_id<up_limit_id,說明這些數(shù)據(jù)在事務(wù)創(chuàng)建id的時都已經(jīng)提交,如注釋中的描述,這些數(shù)據(jù)均可見。

if (trx_id < view->up_limit_id) {return(TRUE);}

row的db_trx_id在low_limit_id和up_limit_id之間,則查找該記錄的db_trx_id是否在自己事務(wù)的read_view->trx_ids列表中,如果在則該記錄的當(dāng)前版本不可見,否則該記錄的當(dāng)前版本可見。

不同隔離級別ReadView實現(xiàn)方式1. read-commited:

Mysql隔離性之Read View的用法說明

即:在每次語句執(zhí)行的過程中,都關(guān)閉read_view, 重新在row_search_for_mysql函數(shù)中創(chuàng)建當(dāng)前的一份read_view。這樣就會產(chǎn)生不可重復(fù)讀現(xiàn)象發(fā)生。

2. repeatable read:

在repeatable read的隔離級別下,創(chuàng)建事務(wù)trx結(jié)構(gòu)的時候,就生成了當(dāng)前的global read view。使用trx_assign_read_view函數(shù)創(chuàng)建,一直維持到事務(wù)結(jié)束。在事務(wù)結(jié)束這段時間內(nèi) 每一次查詢都不會重新重建Read View , 從而實現(xiàn)了可重復(fù)讀。

補(bǔ)充:mysql的mvcc和readview

隔離級別標(biāo)準(zhǔn)定義:

read uncommited 一個事務(wù)讀取到了另一個事務(wù)未提交的結(jié)果(可能發(fā)生回滾),叫臟讀,這會帶來臟讀、幻讀、不可重復(fù)讀問題

read commited 一個事務(wù)a讀取到了另一個事務(wù)b最新提交的結(jié)果,使得事務(wù)a兩次讀取的結(jié)果不同,其避免了臟讀,會出現(xiàn)不可重復(fù)讀,幻讀,通過版本鏈(mvcc)和readview實現(xiàn)。

repeatable read(mysql的默認(rèn)隔離級別) 一個事務(wù)第一次讀過某條記錄后,另一個事務(wù)修改提交了該條記錄后,事務(wù)a讀取到的還是第一次的值,這就是可重復(fù)讀,同一個事務(wù)中多次讀取相同的數(shù)據(jù)返回的結(jié)果是一樣的。事務(wù)不會讀到其他事務(wù)對已有數(shù)據(jù)的修改,即使其他事務(wù)已提交,也就是說,事務(wù)開始時讀到的已有數(shù)據(jù)是什么,在事務(wù)提交前的任意時刻,這些數(shù)據(jù)的值都是一樣的。但是,對于其他事務(wù)新插入的數(shù)據(jù)是可以讀到的,這也就引發(fā)了幻讀問題。其避免了臟讀和不可重復(fù)讀問題,但幻讀依然存在。還是會出現(xiàn)幻讀,(但是mysql解決了幻讀的問題),通過版本鏈和readview實現(xiàn)

serializable 不允許對同一行記錄的讀和寫的并發(fā)操作,必需串行執(zhí)行,所以不會出現(xiàn)幻讀,臟讀現(xiàn)象

在mysql中讀已提交和可重復(fù)讀事務(wù)隔離級別是通過mvcc和readview實現(xiàn)的

mvcc即Multi-Version Concurrency Control,多版本并發(fā)控制,維護(hù)一個數(shù)據(jù)的多個版本,使得事務(wù)之間的讀寫按照隔離級別獲取相應(yīng)的結(jié)果,不發(fā)生沖突

Mysql隔離性之Read View的用法說明

對于隔離級別read committed,每次都生成一個新的readview

對于隔離級別repeatable read,只在事務(wù)開啟時,生成一個readview,直到事務(wù)提交,不發(fā)生變化,所以可以保證可重復(fù)讀。

生成readview時

m_ids:表示活躍事務(wù)id列表

min_trx_id:活躍事務(wù)中的最小事務(wù)id

max_trx_id:已創(chuàng)建的最大事務(wù)id

creator_trx_id:當(dāng)前的事務(wù)id

對當(dāng)前事務(wù)來說,按照以下規(guī)則從最新的版本開始遍歷,獲取對應(yīng)的版本記錄。

1、被訪問的trx_id與readview中的creator_trx_id相同,表示當(dāng)前事務(wù)在訪問自己修改的記錄,可見,返回;

2、被訪問的trx_id小于min_trx_id,表明該版本已提交,可見,返回;

3、被訪問的trx_id大于等于max_trx_id,表明該版本在生成readview時,還未開啟,不可見,返回;

4、被訪問的trx_id在min_trx_id和max_trx_id之間,判斷是否在m_ids中,如果在,則說明生成readview時,該版本事務(wù)未提交,該版本不可見;如果不在,則說明生成readview時,該版本事務(wù)已提交可見,返回。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 日韩天天摸天天澡天天爽视频 | 日本a级片免费观看 | 美女18一级毛片免费看 | 成人国内精品久久久久影院 | 九九热爱视频精品视频高清 | 亚洲影院手机版777点击进入影院 | 日本在线免费观看视频 | 成人影视免费 | 亚洲国产综合久久精品 | 国产欧美一区二区三区沐欲 | 精品综合久久久久久98 | 2021精品国产品免费观看 | 青娱乐色 | 日韩性黄色一级 | 亚洲综合伦理一区 | 日本特黄特色免费大片 | 国产一区视频在线播放 | 国产精品资源手机在线播放 | 美女被拍拍拍拍拍拍拍拍 | 亚洲男人天 | 国产一国产a一级毛片 | 国产愉拍精品手机 | 国产精品欧美视频另类专区 | a级国产乱理伦片在线观看99 | 国产激情视频在线 | 久99久精品视频免费观看v | 国产成人午夜片在线观看 | 欧美成人第一页 | 正在播放国产乱子伦视频 | 俄罗斯美女毛片 | a级毛片免费高清毛片视频 a级毛片免费高清视频 | 午夜精品同性女女 | 日韩一区二区三区免费视频 | 日本久久一区二区 | 国产成人三级 | 农村寡妇特一级毛片 | 亚洲美色综合天天久久综合精品 | 久久99亚洲精品久久久久99 | 国内精品久久久久久影院老狼 | 91久久香蕉国产线看观看软件 | 在线日韩国产 |