InnoDB,快照讀,在RR和RC下有何差異?

2021-08-28 03:05:36 字數 2684 閱讀 9693

昨天挖了乙個坑《innodb的快照讀,到底和什麼相關?》,今天來填坑。

為了保證文章知識體系的完整性,先簡單解釋下快照讀,讀提交,可重複讀。

快照讀(snapshot read)

mysql資料庫,innodb儲存引擎,為了提高併發,使用mvcc機制,在併發事務時,通過讀取資料行的歷史資料版本,不加鎖,來提高併發的一種不加鎖一致性讀(consistent nonlocking read)。

讀提交(read committed)

資料庫領域,事務隔離級別的一種,簡稱rc

它解決「讀髒」問題,保證讀取到的資料行都是已提交事務寫入的

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

可重複讀(repeated read)

資料庫領域,事務隔離級別的一種,簡稱rr

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

在讀提交(rc),可重複讀(rr)兩個不同的事務的隔離級別下,快照讀有什麼不同呢?

先說結論:

事務總能夠讀取到,自己寫入(update /insert /delete)的行記錄

rc下,快照讀總是能讀到最新的行資料快照,當然,必須是已提交事務寫入的

rr下,某個事務首次read記錄的時間為t,未來不會讀取到t時間之後已提交事務寫入的記錄,以保證連續相同的read讀到相同的結果集

畫外音:可以看到

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

(2)由於不加鎖,和互斥關係也不大;

表中有三條記錄:

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讀到的結果集肯定是,這是事務a的第乙個read,假設為時間t;

(2)a3讀到的結果集也是,因為b還沒有提交;

(3)a4讀到的結果集還是,因為事務b是在時間t之後提交的,a4得讀到和a2一樣的記錄;

提問2:假設事務的隔離級別是讀提交rc,a2, a3, a4又分別讀到什麼結果集呢?

回答:rc下

(1)a2讀到的結果集是;

(2)a3讀到的結果集也是,因為b還沒有提交;

(3)a4讀到的結果集還是,因為事務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之前提交事務寫入的資料行,故結果集為。在rc下,沒有疑問,一定是。

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一樣。

囉嗦說了這麼多,用昨天一位網友「山峰」同學的話總結:

rr下,事務在第乙個read操作時,會建立read view

rc下,事務在每次read操作時,都會建立read view

InnoDB的快照讀

有張資料表stu,兩個欄位id和name,id為主鍵 兩個併發事務a和b 事務a a1 start transaction a2 select from book.stu 事務b b1 start transaction b2 insert into book.stu values 5,lujie ...

InnoDB的快照讀,到底和什麼相關?

innodb是非常適合網際網路業務的儲存引擎,其多版本併發控制 multi version concurrency control,mvcc 快照讀 snapshot read 機制,能夠通過讀取回滾段 rollback segment 中資料的歷史版本,在事務讀取記錄的時候不用加鎖,以支援超高的併...

InnoDB的快照讀,到底和什麼相關?

innodb是非常適合網際網路業務的儲存引擎,其多版本併發控制 multi version concurrency control,mvcc 快照讀 snapshot read 機制,能夠通過讀取回滾段 rollback segment 中資料的歷史版本,在事務讀取記錄的時候不用加鎖,以支援超高的併...