mvcc快照讀《通過資料版本使資料庫的事務讀寫不用加鎖就可以保證事務的一致性》
事務隔離級別《提交讀和可重複讀的事務隔離級別作用的資料範圍則分別對應不同的快照版本範圍》
通過以上兩種機制的結合實現innodb事務下的高併發性。
注:本來只有串讀隔離級別才可以解決幻讀問題,而實際上由於快照讀的特性使可重複讀也解決了幻讀問題。
注:當前讀是因為innodb預設為它加入了間隙鎖,防止在事務期間對相關資料集插入記錄,從而避免出現幻讀。
使用場景:
1. 快照讀(snapshot read)
簡單的select操作(不包括 select ... lock in share mode, select ... for update)
2.當前讀(current read)
select ... lock in share mode
select ... for update
insert
update
delete
注:在rr級別下,快照讀是通過mvvc(多版本控制)和undo log來實現的,當前讀是通過加record lock(記錄鎖)和gap lock(間隙鎖)來實現的。如果需要實時顯示資料,還是需要通過手動加鎖來實現。這個時候會使用next-key技術來實現。
注:在mysql中,提供了兩種事務隔離技術,第乙個是mvcc,第二個是next-key技術。這個在使用不同的語句的時候可以動態選擇。不加lock inshare mode之類的快照讀就使用mvcc。否則 當前讀使用next-key。mvcc的優勢是不加鎖,併發性高。缺點是不是實時資料。next-key的優勢是獲取實時資料,但是需要加鎖。
例題:innodb表:t(id pk, name)表中有三條記錄:
1, shenjian
2, zhangsan
3, lisi
case:兩個併發事務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已經提交;
幻讀相同的查詢語句,在事務中第二次讀資料的時候,讀到預期外的記錄。
這裡在網上看到很多說法,有的說事務隔離級別為rr(可重複讀)的時候,會出現幻讀,有的說rr是可以解決幻讀的,下面我用乙個例子,分別模擬rr模式下,不出現幻讀和出現幻讀的兩種場景。
下面的例子,處於mysql innodb引擎下面的預設隔離級別rr。
我們可以看到,在rr級別,先是避免了幻讀,然後又發生了幻讀,下面簡單說明下:
在資料庫的隔離級別的協議中,rr級別是可以避免提交讀(即可做到重複讀),但是無法避免幻讀的。mysql資料庫通過mvcc(多版本併發控制)實現可重複讀的,後文會簡單描述下mvcc,並且可以做到一定程度上避免幻讀,mvcc是快照讀,假如你在這個事務中不破壞這個快照讀,讓它公升級為當前讀,那麼這個事務中,是能保證可重複讀,且不發生幻讀的。
當你在事務中把後面的讀公升級為當前讀的時候,則可能會出現幻讀,因為以及讀取到了最新的資料了,那麼其他事務的提交就可能會讀取出來。
MySQL事務隔離級別和MVCC
原文 mysql事務隔離級別和mvcc mvcc文章勘誤 髒讀 在乙個事務處理過程裡讀取了另乙個未提交的事務中的資料。不可重複讀 乙個事務讀取到了其他事務已經提交的資料,導致前後兩次讀取資料不一致的情況,稱為不可重複讀。幻讀 乙個事務前後兩次讀取資料不一致,是由於其他資料插入資料造成的,這種情況叫做...
簡述MySQL的事務隔離級別和MVCC
mysql事務隔離級別 1 未提交讀 read uncommitted 乙個事務讀到了另外乙個未提交事務修改過的資料 2 已提交讀 read committed 乙個事務只能讀取到另外乙個已提交事務修改過的資料 3 可重複讀 repeated read 首先乙個事務只能讀取另外乙個事務已經提交修改過...
資料庫事務隔離級別與MVCC
事務隔離級別包括 讀未提交 read uncommitted 讀提交 read committed 可重複讀 repeatable read 和序列化 serializable 在實現上,資料庫裡面會建立乙個檢視,訪問的時候以檢視的邏輯結果為準。在可重複讀隔離級別下,這個檢視是在事務啟動時建立的,整...