事務隔離級別在RR和RC下有何差異

2022-10-09 09:12:14 字數 2714 閱讀 8673

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

快照讀(snapshot read)

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

讀提交(read committed)

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

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

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

可重複讀(repeated read)

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

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

先說結論:

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

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

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

畫外音:可以看到

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

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

例子,innodb表:

t(id pk, name);

表中有三條記錄:

1, wangyi

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分別讀到什麼結果集?

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

回答:rr下

(1)a2讀到的結果集肯定是,這是事務a的第乙個read,假設為時間t;

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

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

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,快照讀,在RR和RC下有何差異?

昨天挖了乙個坑 innodb的快照讀,到底和什麼相關?今天來填坑。為了保證文章知識體系的完整性,先簡單解釋下快照讀,讀提交,可重複讀。快照讀 snapshot read mysql資料庫,innodb儲存引擎,為了提高併發,使用mvcc機制,在併發事務時,通過讀取資料行的歷史資料版本,不加鎖,來提高...

事務和事務隔離級別,Spring事務傳播和隔離級別

一 事務有四大特性,也即原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 1 原子性 即不可分割,事務要麼全部被執行,要麼全部不執行。如果事務的所有子事務全部提交成功,則所有的資料庫操作被提交,資料庫狀態發生變化 如果有子事務失敗,...

事務的特性和隔離級別

1.原子性 指事務必須是原子工作單元,對於其資料修改,要麼全都執行,要麼全都不執行。2.一致性 指事務在完成時,必須使所有的資料都保持一致狀態。3.隔離性 指由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。4.永續性 指事務完成之後,對於系統的影響具有永久性。事務隔離級別的含義 是否在讀資...