校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 淺析MySQL如何實現事務隔離

淺析MySQL如何實現事務隔離

熱門標簽:html地圖標注并導航 400電話辦理服務價格最實惠 大豐地圖標注app 催天下外呼系統 武漢電銷機器人電話 北京金倫外呼系統 400電話變更申請 呂梁外呼系統 南太平洋地圖標注

一、前言

眾所周知,MySQL的在RR隔離級別下查詢數據,是可以保證數據不受其它事物影響,而在RC隔離級別下只要其它事物commit后,數據都會讀到commit之后的數據,那么事物隔離的原理是什么?是通過什么實現的呢?那肯定是通過MVCC機制(Multi-Version Concurrency Control,即多版本并發控制)。

注:MySQL的InnoDB引擎之所以能夠支持高性能的并發性能,就是由于MySQL的MVCC機制(歸功于undo log、Read-View、),但是本篇不對MVCC過多的介紹。

參考資料:《MySQL實戰45講》系列,雖然講解的比較清晰,但是仍然需要理解,比如關于視圖數組部分我認為是相比較而言沒有解釋清楚,所以結合資料與自己見解加以記錄!

二、RC與RR隔離級別

我們分別開啟RC與RR隔離級別實驗說明,首先假設有account賬戶表,在事務ABC開啟前,賬戶中的余額balance為1,即

select balance from account =1; # 結果為1

2.1、RR事務隔離級別下查詢結果

當在RR事務隔離級別分別開啟三個事務,在不同時間段內做如下操作

  • 事務A(顯式開啟事務,手動commit提交):查詢余額
  • 事務B(顯式開啟事務,手動commit提交):對id=1的余額加1
  • 事務C(不顯式開啟事務,自動提交):對id=1的余額加1

我們從時間邏輯上分為三個階段,分析結果

  • 第一階段:事務A立馬開始事務,隨后事務B也緊跟著立馬開始事務,然后事務C首先更新balance為2成功,當前balance=2;
  • 第二階段:事務B更新balance的值,此時先讀到當前balance最新值為2,隨后set balance=balance+1成功,當前balance=3;
  • 第三階段:事務A查詢balance的值,此時的值為1(這里為什么等于1呢,是怎么實現的呢?不應該是當前最新值3嗎?這就是本篇博文討論的重點),最后commit結束事務,緊接著事務B也commit結束事務

最后事務A讀取balance的結果是1,理所當然,RR即為可重復讀,即一個事務在執行過程中看到的數據,總是跟這個事務啟動時看到的數據是一致的,當前事務不管有沒有提交,都不會影響數據,我只需要讀取基于快照的數據即可,這就是快照讀。但是我們要討論的是如何在MVCC機制下實現?

注:begin/start transaction 命令并不是一個事務的起點,在執行到它們之后的第一個操作InnoDB表的語句,事務才真正啟動。如果你想要馬上啟動一個事務,可以使用start transaction with consistent snapshot 這個命令。

2.2、RC事務隔離級別下查詢結果

同樣地,我們在RC隔離下,開啟事務ABC,觀察事務A最后的balance結果。

最后事務A讀取balance的結果是2,理所當然,RC即為讀可提交,字面意思就是其他事務只要提交后,當前事務我就能立馬讀取到最新當前值,這就是當前讀。但是我們要討論的是如何在MVCC機制下實現?

實際上這是因為實現MVCC時用到的一致性讀視圖,即consistent read view,用于支持RC(Read Committed,讀提交)和RR(Repeatable Read,可重復讀)隔離級別的實現。

三、事務隔離在MVCC的實現

在探討MVCC如何實現事務隔離前,我們需要知道是視圖數組、一致性視圖等概念,才能幫助更好理解MVCC幫助事務實現了隔離。

3.1、數據行ROW的多版本

InnoDB里面每個事務有一個唯一的事務ID,叫作transaction id。它是在事務開始的時候向InnoDB的事務系統申請的,是按申請順序嚴格遞增的。

而每行數據也都是有多個版本的。每次事務更新數據的時候,都會生成一個新的數據版本,并且把transaction id賦值給這個數據版本的事務ID,記為row trx_id。同時,舊的數據版本要保留,并且在新的數據版本中,能夠有信息可以直接拿到它(通過undo_log文件找到)。

也就是說,數據表中的一行記錄,其實可能有多個版本(row),每個版本有自己的row trx_id。

對某一個數據行ROW某個時刻經過三次更新事務的多版本控制流程,畫如下圖加深理解。

從圖我們可以得到:

  • ROW有四個版本V1-V4,即經過三次更新balance后,當前最新版本為V4,當前balance已經更新為4,是最新值
  • InnoDB每次更新事務產生的transaction id都會賦值給row trx_id;
  • 通過undo_log可以從V4撤回到V1,找到V1版本的balance=1,即undo_log回滾版本。

明白了數據行的ROW的多版本原理與實現后,可以幫助我們理解InnoDB是怎么定義并創建快照的!

3.2、視圖數組

下述部分出自資料中的原句,特別是紅色加深部分可能會比較難以理解,所以需要結合自己理解并畫圖

InnoDB是這么在事務開啟的時候定義快照的,哪些事務的操作我可以忽視,哪么我必須要保存在快照里。可以理解為:一個事務只需要在啟動的時候聲明說,“以我啟動的時刻為準,如果一個數據版本是在我啟動之前生成的,就認;如果是我啟動以后才生成的,我就不認,我必須要找到它的上一個版本”。

在實現上, InnoDB為每個事務構造了一個數組,用來保存這個事務啟動瞬間,當前正在“活躍”的所有事務ID。“活躍”指的就是,啟動了但還沒提交。數組里面事務ID的最小值記為低水位,當前系統里面已經創建過的事務ID的最大值加1記為高水位。這個視圖數組和高水位,就組成了當前事務的一致性視圖(read-view)。

我對低水位與高水位的理解:

低水位=當前所有啟動了但未提交事務集合的ID最小值=當前事務的上一個啟動但未提交的事務ID最小值(所有活躍事務ID最小值)

高水位=當前事務的ID(當前ROW版本號/row trx_id)=已經創建過事務ID的最大值+1

舉例說明:仍然以上述RR隔離級別下三個ABC事務為例

  • 事務A開始前,系統里面只有一個活躍事務ID是99;
  • 事務A、B、C的版本號分別是100、101、102,且當前系統里只有這四個事務;
  • 三個事務開始前,(id,balance)=(1,1)這一行數據的row trx_id是90。

這樣,事務A的視圖數組就是[99], 事務B的視圖數組是[99,100], 事務C的視圖數組是[99,100,101]。即視圖數組通用公式為:[{當前事務開啟瞬間活躍事務ID集合}]。

而數據版本的可見性規則,就是基于rowtrx_id和一致性視圖對比結果得到的,所以我們還必須再了解下一致性視圖

3.3、一致性視圖

通過對視圖數組的理解,一致性視圖就更加容易了,即:這個視圖數組和高水位,就組成了當前事務的一致性視圖(read-view)。

仍然以上述RR隔離級別下三個ABC事務為例

  • 事務A開始前,系統里面只有一個活躍事務ID是99, 所以事物A開啟瞬間活躍事物集合為[99];
  • 事務A、B、C的版本號分別是100、101、102,且當前系統里只有這四個事務,所以事物A、B、C高水位分別為100、101、102;
  • 三個事務開始前,(id,balance)=(1,1)這一行數據的row trx_id是90。

這樣,事務A的一致性視圖就是[99,100], 事務B的一致性視圖是[99,100,101], 事務C的一致性視圖是[99,100,101,102]。即一致性視圖通用公式為:[{當前事務開啟瞬間活躍事務ID集合},當前row trx_id]。

分析上述流程圖結果:

第一個有效更新版本是事物C,更新balance=2,這個時候的最新版本rowtrx_id=102,而之前的在事物ABC之前的活躍事物最新版本row trx_id為99,所以此時99已經成為歷史版本1;

第二個有效更新版本是事物B,更新balance=3,這個時候最新版本rowtrx_id=101,而此時row trx_id=102成為歷史版本1,而rowtrx_id=99成為歷史版本2;

事物A查詢的時候,事物B是沒有提交,但生成的(id, balance)=(1, 3)已經成為當前最新版本,事物A讀取數據時,一致性視圖為[99, 100],而讀數據都是從當前版本切的然后對比row trx_id,所以會有以下流程:

  • 找到(1,3)的時候,判斷出row trx_id=101,比高水位大,處于紅色區域,不可見;
  • 接著,找到上一個歷史版本,一看row trx_id=102,比高水位大,處于紅色區域,不可見;
  • 再往前找,終于找到了(1,1),它的row trx_id=90,比低水位小,處于綠色區域,可見。

最后事物A無論在什么時候查詢,看到的數據都是一致性視圖[99, 100]生成的快照數據(1, 1),即rowtrx_id=90時的數據。這就稱之為一致性讀。

總結:

對于一個事務視圖來說,除了自己的更新總是可見以外,有三種情況:

  • 版本未提交,不可見;
  • 版本已提交,但是是在視圖創建后提交的,不可見;
  • 版本已提交,而且是在視圖創建前提交的,可見。

現在,我們用這個規則來判斷圖中的查詢結果,事務A的查詢語句的視圖數組是在事務A啟動的時候生成的,這時候:

  • (1,3)還沒提交,屬于情況1,不可見;
  • (1,2)雖然提交了,但是是在視圖數組創建之后提交的,屬于情況2,不可見;
  • (1,1)是在視圖數組創建之前提交的,可見。

3.4、當前讀與快照讀

3.4.1、當前讀與快照讀規則

當然按照這個一致性讀的邏輯,事物B在事物C有效更新balance=2之后,但是事物B的視圖數組是在事物C生成的,所以理論上來說不應該是事物B看到的是(id, balance)=(1, 1)這個數據(快照/歷史版本)嗎?而看不到當前版本(1, 2)數據。為什么事物B在更新balance之后直接數據就成為(1, 3)了呢?

如果事物B在update之前select一次數據,看到的值確實是balance=1,但是update是不能在歷史版本上操作的,否則事物C的更新就會丟失,所以update操作都是在先讀取當前版本,然后再更新。

也就說有這么一條規則:更新數據都是先讀后更新,而這個讀是讀當前最新值,稱之為“當前讀(currentread),而只查詢不讀的話就會讀取當前快照,稱之為“快照讀”。所以在事物B更新balance之前,先查詢到最新的版本(1, 2)然后再更新為(1, 3)。而事物A查詢的快照數據為(1, 1),而不是最新版本(1, 3)。

3.4.2、當前讀與快照讀解釋

當前讀:像select lock in share mode(共享鎖), select for update ; update, insert ,delete(排他鎖)這些操作都是一種當前讀。就是它讀取的是記錄的最新版本,讀取時還要保證其他并發事務不能修改當前記錄,會對讀取的記錄進行加鎖。

快照讀:像不加鎖的select操作就是快照讀,即不加鎖的非阻塞讀;快照讀的前提是隔離級別不是串行級別,串行級別下的快照讀會退化成當前讀。是基于多版本控制的,那么快照讀可能讀到的并不一定是數據的最新版本,而有可能是之前的歷史版本(快照數據)。

3.4.3、RC讀可提交下的視圖規則

讀提交的邏輯和可重復讀的邏輯類似,它們最主要的區別是:

在可重復讀隔離級別下,只需要在事務開始的時候創建一致性視圖,之后事務里的其他查詢,都共用這個一致性視圖;在讀提交隔離級別下,每一個語句執行前都會重新算出一個新的視圖,此時start transaction with consistent snapshot就等同于普通的starttransaction/begin所以在RC隔離級別下,事物A與事物B查詢到的數據分別如下:

事物C立馬更新balance=2,然后自動提交,生成最新版本(1, 2),此時重新計算出視圖數據(1, 2);事物B查到此時的最新版本為(1, 2),之后再更新為版本(1, 3)為當前最新版本,查詢此時的事物B select到的balance=3(事物B更新balance=3之后立馬算出一個新的視圖,select就是根據此視圖得到的數據),而不是1。而此時事物B還未提交,對于事物A來說是看不見的,所以事物A此時讀取到的事物C提交的最新版本(1, 2)。

以上就是淺析MySQL如何實現事務隔離的詳細內容,更多關于MySQL事務隔離的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • mysql、oracle默認事務隔離級別的說明
  • MySQL查看和修改事務隔離級別的實例講解
  • Mysql事務隔離級別之讀提交詳解
  • 通過實例分析MySQL中的四種事務隔離級別
  • MySQL四種事務隔離級別詳解
  • MySQL數據庫事務隔離級別詳解
  • MySQL 四種事務隔離級別詳解及對比
  • 深入解析MySQL的事務隔離及其對性能產生的影響
  • MySQL中Innodb的事務隔離級別和鎖的關系的講解教程
  • MySQL數據庫事務隔離級別介紹(Transaction Isolation Level)

標簽:麗水 無錫 龍巖 迪慶 徐州 西寧 南充 自貢

巨人網絡通訊聲明:本文標題《淺析MySQL如何實現事務隔離》,本文關鍵詞  淺析,MySQL,如何,實現,事務,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺析MySQL如何實現事務隔離》相關的同類信息!
  • 本頁收集關于淺析MySQL如何實現事務隔離的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    在线视频观看一区| 极品美女销魂一区二区三区免费| 欧美一区永久视频免费观看| 精品一区二区在线免费观看| 亚洲黄网站在线观看| 亚洲国产精品传媒在线观看| 日韩精品一区在线| 日韩一区二区精品葵司在线| 国产成人h网站| 国产一区二区三区久久悠悠色av| 美国毛片一区二区三区| 日本亚洲视频在线| 免费精品视频在线| 毛片一区二区三区| 青青草91视频| 精品在线一区二区| 国产自产v一区二区三区c| 国产一区二区三区国产| 国产一区二区调教| 蜜臀av性久久久久蜜臀aⅴ| 日韩国产欧美在线视频| 蜜臂av日日欢夜夜爽一区| 美日韩一区二区| 久草精品在线观看| 日本三级亚洲精品| 精品一区二区在线看| 国产精品一区二区果冻传媒| 久久www免费人成看片高清| 九九九久久久精品| 国产91色综合久久免费分享| 久久国产精品99久久久久久老狼 | 午夜视频在线观看一区二区 | 福利一区二区在线观看| 丁香婷婷综合网| 91在线免费视频观看| 91九色02白丝porn| 欧美一区二区三区在线电影| 欧美日韩在线播放三区四区| 欧美一级片在线看| 欧美激情在线一区二区| 国产午夜精品久久久久久久 | 久久精品亚洲精品国产欧美| 欧美高清在线精品一区| 亚洲一区二区三区四区在线观看 | 日韩国产一二三区| 国产成人午夜精品影院观看视频 | 欧美女孩性生活视频| 日韩精品中文字幕在线一区| 精品国产乱码久久久久久图片 | 成人网男人的天堂| 在线综合视频播放| 国产欧美日韩中文久久| 日韩电影免费在线看| 成人性视频网站| 欧美美女一区二区| 中文字幕一区二区三区四区| 婷婷开心激情综合| 91亚洲资源网| 欧美变态tickle挠乳网站| 亚洲欧美一区二区久久| 国产一区激情在线| 欧美精品 国产精品| 国产精品水嫩水嫩| 美腿丝袜亚洲综合| 欧美视频中文一区二区三区在线观看| 精品国产污污免费网站入口 | 成人黄色免费短视频| 91精品福利在线一区二区三区| 国产精品久久久久久久久久免费看| 亚洲国产毛片aaaaa无费看| 91麻豆成人久久精品二区三区| 国产精品理论在线观看| va亚洲va日韩不卡在线观看| 中文字幕不卡在线观看| 高清在线不卡av| 中文字幕一区二| 色综合天天综合色综合av| 亚洲免费色视频| 欧美三级一区二区| 日本亚洲一区二区| 欧美成人性福生活免费看| 国模无码大尺度一区二区三区| 精品日韩成人av| 国产乱码精品一区二区三区五月婷| 26uuu色噜噜精品一区二区| 国内精品嫩模私拍在线| 日本一区二区三区在线观看| 风流少妇一区二区| 国产精品乱人伦| 色老汉一区二区三区| 亚洲一区二区精品视频| 欧美精品三级在线观看| 麻豆精品精品国产自在97香蕉 | 国产很黄免费观看久久| 亚洲欧美日韩人成在线播放| 欧美日韩免费高清一区色橹橹| 亚洲不卡在线观看| 久久尤物电影视频在线观看| 高清av一区二区| 亚洲午夜视频在线| 精品国产露脸精彩对白| av中文字幕亚洲| 调教+趴+乳夹+国产+精品| 久久中文字幕电影| 欧美在线观看你懂的| 久久99久久99精品免视看婷婷 | 五月婷婷激情综合网| 精品少妇一区二区三区免费观看| 国产电影一区二区三区| 一区二区三区欧美久久| 欧美精品一区二区三区蜜桃视频| 99久久精品免费观看| 毛片av中文字幕一区二区| 亚洲欧美日韩一区二区| 久久综合色天天久久综合图片| 色诱视频网站一区| 国产福利91精品一区二区三区| 亚洲午夜久久久久久久久电影院| 久久久一区二区| 欧美日韩成人综合在线一区二区 | 一区二区三区在线视频播放| 精品区一区二区| 欧美色视频在线| 99久久亚洲一区二区三区青草| 美女免费视频一区二区| 亚洲国产成人91porn| 国产精品色在线| 26uuu另类欧美亚洲曰本| 欧美一区二区国产| 欧美日韩国产成人在线91 | 亚洲成人自拍一区| 中文字幕在线观看不卡| 欧美电视剧免费观看| 欧美另类高清zo欧美| 色婷婷综合久久久中文字幕| 国产精品99久久久久久宅男| 免费高清不卡av| 秋霞电影一区二区| 无吗不卡中文字幕| 亚洲国产精品人人做人人爽| 一色屋精品亚洲香蕉网站| 国产香蕉久久精品综合网| 欧美成人在线直播| 日韩视频国产视频| 日韩一级二级三级| 91精品免费观看| 欧美精品九九99久久| 欧美日韩成人综合天天影院 | 久久99在线观看| 青青国产91久久久久久| 日韩高清不卡一区二区三区| 日本不卡一二三| 久久成人精品无人区| 韩国欧美国产一区| 国产一区二区三区综合| 国产高清亚洲一区| 丰满少妇久久久久久久| 成人黄色免费短视频| 99国产精品一区| 在线亚洲一区二区| 欧美三级韩国三级日本一级| 欧美色窝79yyyycom| 欧美精品日日鲁夜夜添| 日韩欧美一级特黄在线播放| 精品久久久久久久一区二区蜜臀| 久久久亚洲欧洲日产国码αv| 国产亚洲精品超碰| 亚洲欧洲精品天堂一级 | 日韩欧美中文字幕公布| 日韩精品专区在线影院重磅| 26uuu亚洲综合色欧美| 国产精品视频一二三| 亚洲一级不卡视频| 精品影视av免费| 一本到一区二区三区| 日韩一区二区三区在线视频| 久久伊99综合婷婷久久伊| 国产精品视频一二三区| 午夜视频一区在线观看| 激情欧美一区二区| av不卡免费在线观看| 欧美久久久久久蜜桃| 国产午夜精品久久久久久久| 亚洲免费在线电影| 国产一区二区三区在线观看免费视频 | 一本到不卡免费一区二区| 日韩亚洲欧美高清| 综合久久给合久久狠狠狠97色| 亚洲午夜久久久久久久久电影网| 久久精品国产亚洲aⅴ| 成人免费观看视频| 9191久久久久久久久久久| 亚洲国产精品ⅴa在线观看| 日韩电影免费在线| 91免费视频网址| 国产欧美一区二区三区在线看蜜臀| 一区二区三区在线免费播放| 国产久卡久卡久卡久卡视频精品| 欧美综合欧美视频| 国产精品久久夜|