成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關(guān)于MVCC,我之前寫錯了,這次我改好了!

開發(fā) 前端
要說幻讀,首先要了解MVCC,MVCC叫做多版本并發(fā)控制,實際上就是保存了數(shù)據(jù)在某個時間節(jié)點的快照。

[[383097]]

 簡單理解版

以下先引用我之前寫過的那篇中的內(nèi)容,可以快速理解,建議先簡單看看。

要說幻讀,首先要了解MVCC,MVCC叫做多版本并發(fā)控制,實際上就是保存了數(shù)據(jù)在某個時間節(jié)點的快照。

我們每行數(shù)據(jù)實際上隱藏了兩列,創(chuàng)建時間版本號,過期(刪除)時間版本號,每開始一個新的事務(wù),版本號都會自動遞增。

還是拿上面的user表舉例子,假設(shè)我們插入兩條數(shù)據(jù),他們實際上應該長這樣。

這時候假設(shè)小明去執(zhí)行查詢,此時current_version=3

  1. select * from user where id<=3; 

同時,小紅在這時候開啟事務(wù)去修改id=1的記錄,current_version=4

  1. update user set name='張三三' where id=1; 

執(zhí)行成功后的結(jié)果是這樣的

如果這時候還有小黑在刪除id=2的數(shù)據(jù),current_version=5,執(zhí)行后結(jié)果是這樣的。

由于MVCC的原理是查找創(chuàng)建版本小于或等于當前事務(wù)版本,刪除版本為空或者大于當前事務(wù)版本,小明的真實的查詢應該是這樣

  1. select * from user where id<=3 and create_version<=3 and (delete_version>3 or delete_version is null); 

所以小明最后查詢到的id=1的名字還是'張三',并且id=2的記錄也能查詢到。這樣做是為了保證事務(wù)讀取的數(shù)據(jù)是在事務(wù)開始前就已經(jīng)存在的,要么是事務(wù)自己插入或者修改的。

真正原理

事實上,上述的說法只是簡化版的理解,真正的MVCC用于讀已提交和可重復讀級別的控制,主要通過undo log日志版本鏈和read view來實現(xiàn)。

每條數(shù)據(jù)隱藏的兩個字段也并不是創(chuàng)建時間版本號和過期(刪除)時間版本號,而是roll_pointer和trx_id。

roll_pointer指向更新事務(wù)之前生成的undo log,undo log用于事務(wù)的回滾,保證事務(wù)的原子性。

trx_id就是最近一次更新數(shù)據(jù)的事務(wù)ID。

以上述例子來舉例,最初插入兩條數(shù)據(jù),真實的情況是這樣,因為第一次插入數(shù)據(jù)沒有undo log,所以roll_pointer指向一個空的undo log。

這時候假設(shè)小明去執(zhí)行查詢,就會開啟一個read view,read view包含幾個重要的東西。

  1. m_ids,就是還未提交的事務(wù)id集合
  2. low_limit_id,m_ids里最小的值
  3. up_limit_id,m_ids里的最大值
  4. creator_trx_id,創(chuàng)建read view的事務(wù)ID,也就是自己的事務(wù)ID

小明來執(zhí)行查詢了,當前事務(wù)ID=3

  1. select * from user where id<=3; 

小紅在這時候開啟事務(wù)去修改id=1的記錄,事務(wù)ID=4

  1. update user set name='張三三' where id=1; 

這時候小明的read view是這樣。

  1. m_ids=[3,4] 
  2. low_limit_id=3 
  3. up_limit_id=5 
  4. creator_trx_id=3 

所以,小明在執(zhí)行查詢的時候,會去判斷當前這條數(shù)據(jù)的trx_id

這時候,小紅的修改也完成了,小紅數(shù)據(jù)于是就變成了這樣。

如果小明再次去查詢的話,就會發(fā)現(xiàn)現(xiàn)在的trx_id>read view的low_limit_id,也就是4>3,不符合條件,同時發(fā)現(xiàn)現(xiàn)在的trx_id=4在low_limit_id和up_limit_id [3,5]之間,并且trx_id=4在m_ids=[3,4]之中,所以就會根據(jù)roll_pointer指向的undo log去查找,trx_id=1小于現(xiàn)在的low_limit_id=3,符合條件,就找到了上一個版本name=張三的記錄。

如果這時候小明自己去修改這條記錄的值,把名字改成張五,結(jié)果就是這樣。

然后小明去查詢的話,就會發(fā)現(xiàn)當前的trx_id=3就是自己的creator_trx_id,就是自己,那么就直接返回這條數(shù)據(jù)。

所以,我們可以先總結(jié)下幾種情況:

  1. 如果trx_id次開啟事務(wù)查詢的場景<>
  2. 如果trx_id>low_limit,trx_id還在[low_limit_id,up_limit_id]范圍之內(nèi),并且trx_id在m_ids中,就會根據(jù)roll_pointer去查找undo log日志鏈,找到之前版本的數(shù)據(jù),對應的就是小紅修改后小明再次查詢的場景
  3. 如果trx_id=creator_trx_id,那么說明就是自己修改的,直接返回就好了,對應的就是小明自己去修改數(shù)據(jù)的場景

不同隔離級別的實現(xiàn)

根據(jù)上面闡述的原理,你可能發(fā)現(xiàn)了,這是可重復讀下的實現(xiàn)啊,保證每次讀取到的數(shù)據(jù)都是一致的。

那么,如果是讀已提交級別下,這個是怎么實現(xiàn)的?

其實很簡單,在上面的原理解釋中,我都是假設(shè)每次查詢的時候生成了read view,后續(xù)并沒有重新生成。

而讀已提交級別下,則是每次查詢都會生成一次read view。

以上述小紅修改過張三后的場景來舉例。

在可重復度級別下,由于trx_id>low_limit,trx_id還在[low_limit_id,up_limit_id]范圍之內(nèi),并且trx_id在m_ids中,滿足我們上述的條件2,所以就會根據(jù)roll_pointer找到之前的版本記錄,保證可重復讀。

而在讀已提交的級別下,重新生成了read view,這時候trx_id不在m_ids之中,說明事務(wù)已經(jīng)提交,所以可以直接返回這條數(shù)據(jù),所以查到的數(shù)據(jù)就是小紅修改后的name=張三三的數(shù)據(jù)了。

本文轉(zhuǎn)載自微信公眾號「艾小仙」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系艾小仙公眾號。

 

責任編輯:武曉燕 來源: 艾小仙
相關(guān)推薦

2022-04-26 06:43:12

文檔TCPLinux

2022-07-05 16:36:19

通信網(wǎng)絡(luò)通信故障

2022-03-01 21:05:39

TCP網(wǎng)絡(luò)協(xié)議

2023-11-29 09:09:27

OceanBase底層

2021-12-02 08:19:06

MVCC面試數(shù)據(jù)庫

2022-03-26 08:49:13

MySQL數(shù)據(jù)存儲

2018-03-26 09:05:18

CTO

2022-03-18 11:50:06

AI模型GPT-3

2021-11-04 09:08:39

項目JS 解構(gòu)知識

2021-04-27 08:25:52

MVCC數(shù)據(jù)MySQL

2023-07-10 09:53:59

console開發(fā)插件

2020-10-23 09:50:20

鏈表Java代碼

2020-08-10 07:52:30

MySQL數(shù)據(jù)庫

2024-05-06 00:30:00

MVCC數(shù)據(jù)庫

2020-08-31 18:54:21

iPadWindowsMacOS

2014-11-13 09:21:23

TCP

2020-03-16 08:00:44

Nginx應用特點

2022-08-31 15:57:11

程序員

2025-04-14 08:15:00

2022-04-22 08:22:50

MVCCMySQLC++
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文字幕视频在线观看 | 亚洲国产精品成人 | 欧美激情一区二区三区 | 欧美一级片在线观看 | 国产免费观看一级国产 | 精品乱人伦一区二区三区 | 伊色综合久久之综合久久 | 国产成人精品一区二区 | 亚洲成人av | 色狠狠一区 | 国产精品夜色一区二区三区 | 久久精品1| 欧美三区在线观看 | 一区二区三区视频免费看 | 欧美一级毛片久久99精品蜜桃 | 精品视频999| 精品美女久久久久久免费 | av在线播放免费 | 黄色亚洲 | 国产日韩欧美一区二区在线播放 | 欧日韩在线 | 国产一区在线视频 | 成人在线观看免费视频 | 亚洲xxxxx | 亚洲网站在线观看 | 99久久久99久久国产片鸭王 | 成人一区二| 久久激情视频 | 9久久精品 | 在线观看视频91 | 97国产一区二区精品久久呦 | 国产一级视频在线观看 | 在线观看视频中文字幕 | 亚洲精品字幕 | 精品国产乱码久久久久久久久 | av片在线观看网站 | 美女久久 | 国内精品久久精品 | 天天操天天干天天爽 | 日韩中文在线 | 久久国产精品-久久精品 |