innodb是非常適合網際網路業務的儲存引擎,其多版本併發控制(multi version concurrency control, mvcc),快照讀(snapshot read)機制,能夠通過讀取回滾段(rollback segment)中資料的歷史版本,在事務讀取記錄的時候不用加鎖,以支援超高的併發。
【併發控制,快照讀,回滾段】輔助閱讀:
《innodb併發如此高,原因竟然在這?》
在讀提交(read committed, rc),可重複讀(repeated read, rr)兩個不同的事務的隔離級別下,快照讀的玩法有什麼差異,又和什麼因素有關呢?
【事務隔離級別】輔助閱讀:
《4種事務的隔離級別,如何巧妙實現?》
假設有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分別讀到什麼結果集?
提問2:假設事務的隔離級別是讀提交rc,a2, a3, a4又分別讀到什麼結果集呢?
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 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的結果集又是什麼呢?
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的結果集又是什麼呢?
同樣是讀取歷史資料版本,快照讀究竟受什麼影響呢?是不是很有意思?答案與原理明天揭曉。
InnoDB的快照讀,到底和什麼相關?
innodb是非常適合網際網路業務的儲存引擎,其多版本併發控制 multi version concurrency control,mvcc 快照讀 snapshot read 機制,能夠通過讀取回滾段 rollback segment 中資料的歷史版本,在事務讀取記錄的時候不用加鎖,以支援超高的併...
InnoDB的快照讀,到底和什麼相關?
innodb是非常適合網際網路業務的儲存引擎,其多版本併發控制 multi version concurrency control,mvcc 快照讀 snapshot read 機制,能夠通過讀取回滾段 rollback segment 中資料的歷史版本,在事務讀取記錄的時候不用加鎖,以支援超高的併...
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 ...