自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你真的可以講明白MVCC多版本控制機(jī)制嗎?

數(shù)據(jù)庫(kù) MySQL
讀提交和可重復(fù)讀隔離級(jí)別都是依賴于MVCC多版本控制機(jī)制實(shí)現(xiàn),今天我們就來討論mysql中的MVCC多版本控制機(jī)制。

多事務(wù)操作同一行數(shù)據(jù)的時(shí)候,就會(huì)出現(xiàn)各種并發(fā)問題,mysql通過四種隔離級(jí)別來解決這些問題,

  • 讀未提交隔離級(jí)別是最寬松的,基本沒有做隔離,所以實(shí)現(xiàn)起來很簡(jiǎn)單;
  • 讀提交隔離級(jí)別是每次執(zhí)行語(yǔ)句(包括查詢和更新語(yǔ)句)的時(shí)候都會(huì)生成一個(gè)一致性視圖,從而保證當(dāng)前事務(wù)可以看到其他事務(wù)提交后的數(shù)據(jù);
  • 可重復(fù)讀隔離級(jí)別的實(shí)現(xiàn)是每個(gè)事務(wù)在開啟的時(shí)候都會(huì)生成一個(gè)一致性視圖,當(dāng)其他事務(wù)有提交后也不會(huì)影響當(dāng)前事務(wù)中的數(shù)據(jù),要保證這一點(diǎn)mysql是通過多版本控制機(jī)制MVCC來實(shí)現(xiàn)的。
  • 可串行化隔離級(jí)別的隔離級(jí)別比較高,是通過加鎖來實(shí)現(xiàn),所以mysql有一套鎖機(jī)制。

讀提交和可重復(fù)讀隔離級(jí)別都是依賴于MVCC多版本控制機(jī)制實(shí)現(xiàn),今天我們就來討論mysql中的MVCC多版本控制機(jī)制。

一、MVCC多版本控制機(jī)制

MVCC機(jī)制是通過read-view機(jī)制與undo log版本鏈比對(duì)機(jī)制,使得不同的事務(wù)會(huì)根據(jù)數(shù)據(jù)版本鏈對(duì)比規(guī)則讀取同一條數(shù)據(jù)在版本鏈上的不同版本數(shù)據(jù)。

1.undo log版本鏈

事務(wù)在開啟的時(shí)候首先會(huì)申請(qǐng)一個(gè)事務(wù)id:ransaction id。

事務(wù)對(duì)某行數(shù)據(jù)做修改操作的時(shí)候,Mysql會(huì)保留修改前的數(shù)據(jù)undo回滾日志,并且把事務(wù)id:ransaction id賦值給版本記錄中的字段trx_id。

把這些undo log日志串聯(lián)起來形成一個(gè)歷史記錄版本鏈,如圖:

注意這里的版本記錄不是真實(shí)物理存在的,真實(shí)物理存在只有最新的一條記錄,其他歷史記錄都是通過回滾日志推導(dǎo)出來的。

2.read-view機(jī)制

可重復(fù)讀隔離級(jí)別和讀提交隔離級(jí)別是通過生成一個(gè)一致性視圖來實(shí)現(xiàn),這個(gè)一致性視圖就是read-view。

(1) 一致性視圖是什么

一個(gè)事務(wù)啟動(dòng)的時(shí)候,innodb會(huì)為這個(gè)事務(wù)構(gòu)造一個(gè)數(shù)組,用來保存這個(gè)事務(wù)的啟動(dòng)瞬間正在活躍的所有事務(wù)id?!盎钴S”指的是啟動(dòng)了,但是沒提交。

數(shù)組里面id最小的值即為低水位,最大的值+1記為高水位,這便是一致性視圖。

每個(gè)事務(wù)在做查詢的時(shí)候會(huì)根據(jù)一致性視圖的可見性規(guī)則去undo log版本鏈中推導(dǎo)對(duì)應(yīng)的數(shù)據(jù)。

(2) 一致性視圖的可見性規(guī)則

a. 如果當(dāng)前事務(wù)id落在綠色部分,表示這個(gè)版本是已提交的事務(wù)或者是當(dāng)前事務(wù)自己生成的,這個(gè)數(shù)據(jù)是可見的;

b. 如果當(dāng)前事務(wù)id落在紅色部分,表示這個(gè)版本是由將來啟動(dòng)的事務(wù)生成的,是肯定不可見的;

c. 如果當(dāng)前事務(wù)id落在黃色部分,那就包括兩種情況:

  • 若 row trx_id在數(shù)組中,表示這個(gè)版本是由還沒提交的事務(wù)生成的,不可見;
  • 若 row trx_id不在數(shù)組中,表示這個(gè)版本是已經(jīng)提交了的事務(wù)生成的,可見。

二、案例

圖中事務(wù)A查詢的i是什么?我們先來分析一下。

按照從上到下事務(wù)開啟的順序,每個(gè)事務(wù)對(duì)應(yīng)的一致性視圖如下:

  • 事務(wù)A的一致性視圖數(shù)組[11]
  • 事務(wù)B的一致性視圖數(shù)組[11,12]
  • 事務(wù)C的一致性視圖數(shù)組[11,12,13]

事務(wù)A在查詢的那個(gè)時(shí)刻,undo log版本鏈?zhǔn)牵?/p>

{trx_id=11,id=1,i=10,roll_pointer=0}>>>{trx_id=13,id=1,i=11,roll_pointer=1}>>>{trx_id=12,id=1,i=12,roll_pointer=2}
“{}”  代表的是版本記錄
“>>>” 代表的是回滾日志undo log

事務(wù)A在查詢的時(shí)候,事務(wù)B和事務(wù)C屬于未來事務(wù),對(duì)事務(wù)A是不可見的。因此事務(wù)A查詢的數(shù)據(jù)是通過最新的數(shù)據(jù)記錄根據(jù)undo log不斷向前回滾才得到的數(shù)據(jù):i=10。

再看一個(gè)案例:

事務(wù)A查詢1結(jié)果是什么?

事務(wù)A查詢2結(jié)果是什么?

由一致性視圖可見性規(guī)則分析,對(duì)事務(wù)A來說,事務(wù)B是未來事務(wù),對(duì)事務(wù)A是不可見的,因此查詢結(jié)果i=10。

查詢2的結(jié)果i=12,為什么呢?先來看看兩個(gè)概念:

  • 在可重復(fù)讀隔離級(jí)別中這種通過回滾日志找到對(duì)應(yīng)版本記錄的讀取方式就是一致性讀,而不需要回滾,永遠(yuǎn)只需要讀取最新版本記錄的方式就是當(dāng)前讀。
  • 事務(wù)中如果有更新語(yǔ)句的話,更新語(yǔ)句都是以當(dāng)前讀的方式讀取到版本記錄中最新數(shù)據(jù),然后再進(jìn)行更新操作,因此上圖中的查詢結(jié)果為i=12。

下面兩種查詢方式也是當(dāng)前讀:

select k from t where id=1 lock in share mode;

select k from t where id=1 for update;

以上便是MVCC機(jī)制,按照其規(guī)則,這種機(jī)制只有在可重復(fù)讀隔離級(jí)別和讀提交隔離級(jí)別下才會(huì)有。

責(zé)任編輯:趙寧寧 來源: 碼農(nóng)本農(nóng)
相關(guān)推薦

2018-08-20 16:00:23

MySQL并發(fā)控制MVCC

2023-12-06 08:23:16

MVCCmysql

2023-10-17 15:44:19

TCP四次揮手

2011-08-17 10:11:34

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

2023-11-01 13:48:00

反射java

2023-05-10 11:07:18

2021-09-08 07:49:35

Dubbo連接控制

2018-08-06 14:18:09

Linux應(yīng)用程序技術(shù)

2023-11-29 08:01:38

websocket協(xié)議

2016-06-01 15:42:58

Hadoop數(shù)據(jù)管理分布式

2020-04-17 14:25:22

Kubernetes應(yīng)用程序軟件開發(fā)

2022-07-26 00:00:22

HTAP系統(tǒng)數(shù)據(jù)庫(kù)

2014-04-17 16:42:03

DevOps

2023-10-29 17:08:38

AQS線程

2017-08-17 15:13:52

PostgreSQL MVCC機(jī)制

2020-12-07 11:05:21

HttpClient代碼Java

2021-06-13 12:03:46

SaaS軟件即服務(wù)

2021-10-09 00:02:04

DevOps敏捷開發(fā)

2022-03-27 20:32:28

Knative容器事件模型

2016-03-01 17:48:32

WLAN控制器網(wǎng)絡(luò)管理
點(diǎn)贊
收藏

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