【58沈劍 架構師之路】InnoDB,快照讀,在RR和RC下有何差別?

快照讀(Snapshot Read)數據庫

MySQL數據庫,InnoDB存儲引擎,爲了提升併發,使用MVCC機制,在併發事務時,經過讀取數據行的歷史數據版本,不加鎖,來提升併發的一種不加鎖一致性讀(Consistent Nonlocking Read)。併發

 

讀提交(Read Committed)高併發

  • 數據庫領域,事務隔離級別的一種,簡稱RCspa

  • 它解決「讀髒」問題,保證讀取到的數據行都是已提交事務寫入的3d

  • 它可能存在「讀幻影行」問題,同一個事務裏,連續相同的read可能讀到不一樣的結果集事務

 

可重複讀(Repeated Read)get

  • 數據庫領域,事務隔離級別的一種,簡稱RRit

  • 它不但解決「讀髒」問題,還解決了「讀幻影行」問題,同一個事務裏,連續相同的read讀到相同的結果集io

 

讀提交(RC),可重複讀(RR)兩個不一樣的事務的隔離級別下,快照讀有什麼不一樣呢?date

 

先說結論

  • 事務總可以讀取到,本身寫入(update /insert /delete)的行記錄

  • RC下,快照讀老是能讀到最新的行數據快照,固然,必須是已提交事務寫入的

  • RR下,某個事務首次read記錄的時間爲T,將來不會讀取到T時間以後已提交事務寫入的記錄,以保證連續相同的read讀到相同的結果集

畫外音:能夠看到

(1)和併發事務的開始時間不要緊,和事務首次read的時間有關;

(2)因爲不加鎖,和互斥關係也不大;

 

這些就能解答《InnoDB的快照讀,到底和什麼相關?》中的問題了,InnoDB表:

t(id PK, name);
 
表中有三條記錄:
1, shenjian
2, zhangsan
3, lisi

 

case 1,兩個併發事務A,B執行的時間序列以下(A先於B開始,B先於A結束):

A1: start transaction;
         B1: start transaction;
A2: select * from t;
         B2: insert into t values (4, wangwu);
A3: select * from t;
         B3: commit;
A4: select * from t;

 

提問1:假設事務的隔離級別是可重複讀RR,事務A中的三次查詢,A2, A3, A4分別讀到什麼結果集?

 

回答:RR下

(1)A2讀到的結果集確定是{1, 2, 3},這是事務A的第一個read,假設爲時間T;

(2)A3讀到的結果集也是{1, 2, 3},由於B尚未提交;

(3)A4讀到的結果集仍是{1, 2, 3},由於事務B是在時間T以後提交的,A4得讀到和A2同樣的記錄;


提問2:假設事務的隔離級別是讀提交RC,A2, A3, A4又分別讀到什麼結果集呢?

 

回答:RC下

(1)A2讀到的結果集是{1, 2, 3};

(2)A3讀到的結果集也是{1, 2, 3},由於B尚未提交;

(3)A4讀到的結果集仍是{1, 2, 3, 4},由於事務B已經提交;

 

case 2,仍然是上面的兩個事務,只是A和B開始時間稍有不一樣(B先於A開始,B先於A結束):

         B1: start transaction;

A1: start transaction;

A2: select * from t;
         B2: insert into t values (4, wangwu);
A3: select * from t;
         B3: commit;
A4: select * from t;

 

提問3:假設事務的隔離級別是可重複讀RR,事務A中的三次查詢,A2, A3, A4分別讀到什麼結果集?

提問4:假設事務的隔離級別是讀提交RC,A2, A3, A4的結果集又是什麼呢?
 

回答:事務的開始時間不同,不會影響「快照讀」的結果,因此結果集和case 1同樣。

 

case 3,仍然是併發的事務A與B(A先於B開始,B先於A結束):

A1: start transaction;
         B1: start transaction;
         B2: insert into t values (4, wangwu);
         B3: commit;
A2: select * from t;

 

提問5:假設事務的隔離級別是可重複讀RR,事務A中的A2查詢,結果集是什麼?

提問6:假設事務的隔離級別是讀提交RC,A2的結果集又是什麼呢?

 

回答:在RR下,

A2是事務A的第一個read,假設爲時間T,它能讀取到T以前提交事務寫入的數據行,故結果集爲{1, 2, 3, 4}。在RC下,沒有疑問,必定是{1, 2, 3, 4}。

 

case 4,事務開始的時間再換一下(B先於A開始,B先於A結束):

         B1: start transaction;

A1: start transaction;

         B2: insert into t values (4, wangwu);

         B3: commit;
A2: select * from t;

 

提問7:假設事務的隔離級別是可重複讀RR,事務A中的A2查詢,結果集是什麼?

提問8:假設事務的隔離級別是讀提交RC,A2的結果集又是什麼呢?

 

回答:事務的開始時間不同,不會影響「快照讀」的結果,因此結果集和case 3同樣。

相關文章
相關標籤/搜索