婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Mysql隔離性之Read View的用法說明

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

熱門標簽:南昌三維地圖標注 怎樣在地圖標注銷售區域 啥是企業400電話辦理 電話外呼系統改號 百應電話機器人優勢 武漢網絡外呼系統服務商 地圖標注費用是多少 外呼系統打電話上限是多少 曲靖移動外呼系統公司

當前事務能讀取到哪個歷史版本?

Read View是事務開啟時,當前所有事務的一個集合,這個數據結構中存儲了當前Read View中最大的ID及最小的ID。

這就是當前活躍事務列表,如下所示:

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

ct-trx 表示當前事務的id,對應上面的read_view數據結構如下,

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是“高水位”,即當時活躍事務的最大id,如果讀到row的db_trx_id>=low_limit_id,說明這些id在此之前的數據都沒有提交,如注釋中的描述,這些數據都不可見。

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

注:readview 部分源碼

up_limit_id是“低水位”,即當時活躍事務列表的最小事務id,如果row的db_trx_idup_limit_id,說明這些數據在事務創建id的時都已經提交,如注釋中的描述,這些數據均可見。

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

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

不同隔離級別ReadView實現方式

1. read-commited:

即:在每次語句執行的過程中,都關閉read_view, 重新在row_search_for_mysql函數中創建當前的一份read_view。這樣就會產生不可重復讀現象發生。

2. repeatable read:

在repeatable read的隔離級別下,創建事務trx結構的時候,就生成了當前的global read view。使用trx_assign_read_view函數創建,一直維持到事務結束。在事務結束這段時間內 每一次查詢都不會重新重建Read View , 從而實現了可重復讀。

補充:mysql的mvcc和readview

隔離級別標準定義:

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

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

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

serializable 不允許對同一行記錄的讀和寫的并發操作,必需串行執行,所以不會出現幻讀,臟讀現象

在mysql中讀已提交和可重復讀事務隔離級別是通過mvcc和readview實現的

mvcc即Multi-Version Concurrency Control,多版本并發控制,維護一個數據的多個版本,使得事務之間的讀寫按照隔離級別獲取相應的結果,不發生沖突

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

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

生成readview時

m_ids:表示活躍事務id列表

min_trx_id:活躍事務中的最小事務id

max_trx_id:已創建的最大事務id

creator_trx_id:當前的事務id

對當前事務來說,按照以下規則從最新的版本開始遍歷,獲取對應的版本記錄。

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

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時,該版本事務未提交,該版本不可見;如果不在,則說明生成readview時,該版本事務已提交可見,返回。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 通過實例認識MySQL中前綴索引的用法
  • MySQL前綴索引導致的慢查詢分析總結
  • 詳解MySQL中事務隔離級別的實現原理
  • 聊聊MySQL事務的特性和隔離級別
  • 簡述MySql四種事務隔離級別
  • MySQL事務及Spring隔離級別實現原理詳解
  • Mysql事務隔離級別原理實例解析
  • Mysql事務隔離級別之讀提交詳解
  • MySQL 隔離數據列和前綴索引的使用總結

標簽:黑河 資陽 荊州 滄州 甘南 錦州 吉林 隨州

巨人網絡通訊聲明:本文標題《Mysql隔離性之Read View的用法說明》,本文關鍵詞  Mysql,隔,離性,之,Read,View,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Mysql隔離性之Read View的用法說明》相關的同類信息!
  • 本頁收集關于Mysql隔離性之Read View的用法說明的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 东港市| 云龙县| 崇仁县| 泊头市| 永顺县| 林州市| 伊吾县| 公主岭市| 辽阳县| 双峰县| 玛多县| 合水县| 扬中市| 武汉市| 泾源县| 湄潭县| 曲阜市| 华坪县| 英超| 阳西县| 邹城市| 凤城市| 淮滨县| 乡城县| 苗栗市| 中方县| 惠水县| 白玉县| 垣曲县| 武安市| 汝阳县| 全南县| 建湖县| 乳山市| 交口县| 贵阳市| 神农架林区| 孟津县| 鄢陵县| 若尔盖县| 德保县|