什麼是mvvc?
mvvc (multi-version concurrency control) (注:與mvcc相對的,是基於鎖的併發控制,lock-based concurrency control)是一種基於多版本的併發控制協議,只有在innodb引擎下存在。mvcc是為了實現事務的隔離性,通過版本號,避免同一資料在不同事務間的競爭,你可以把它當成基於多版本號的一種樂觀鎖。當然,這種樂觀鎖只在事務級別未提交鎖和已提交鎖時才會生效。mvcc最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不衝突。在讀多寫少的oltp應用中,讀寫不衝突是非常重要的,極大的增加了系統的併發效能。具體見下面介紹。
mvvc的實現機制
innodb在每行資料都增加兩個隱藏字段,乙個記錄建立的版本號,乙個記錄刪除的版本號。
在多版本併發控制中,為了保證資料操作在多執行緒過程中,保證事務隔離的機制,降低鎖競爭的壓力,保證較高的併發量。在每開啟乙個事務時,會生成乙個事務的版本號,被操作的資料會生成一條新的資料行(臨時),但是在提交前對其他事務是不可見的,對於資料的更新(包括增刪改)操作成功,會將這個版本號更新到資料的行中,事務提交成功,將新的版本號更新到此資料行中,這樣保證了每個事務操作的資料,都是互不影響的,也不存在鎖的問題。
mvvc下的crud
select:
當隔離級別是repeatable read時select操作,innodb必須每行資料來保證它符合兩個條件: innodb必須找到乙個行的版本,它至少要和事務的版本一樣老(也即它的版本號不大於事務的版本號)。這保證了不管是事務開始之前,或者事務建立時,或者修改了這行資料的時候,這行資料是存在的。
這行資料的刪除版本必須是未定義的或者比事務版本要大。這可以保證在事務開始之前這行資料沒有被刪除。
符合這兩個條件的行可能會被當作查詢結果而返回。
insert:
innodb為這個新行記錄當前的系統版本號。
delete:
innodb將當前的系統版本號設定為這一行的刪除id。
update:
innodb會寫乙個這行資料的新拷貝,這個拷貝的版本為當前的系統版本號。它同時也會將這個版本號寫到舊行的刪除版本裡。
這種額外的記錄所帶來的結果就是對於大多數查詢來說根本就不需要獲得乙個鎖。他們只是簡單地以最快的速度來讀取資料,確保只選擇符合條件的行。這個方案的缺點在於儲存引擎必須為每一行儲存更多的資料,做更多的檢查工作,處理更多的善後操作。
mvcc只工作在repeatable read和read commited隔離級別下。read uncommited不是mvcc相容的,因為查詢不能找到適合他們事務版本的行版本;它們每次都只能讀到最新的版本。seriablable也不與mvcc相容,因為讀操作會鎖定他們返回的每一行資料。
mysql事務的實現方式 mvvc 鎖
1.什麼是mvvc 條件 1.1只有在innodb引擎下存在的一種基於多版本的併發控制協議 1.2mvcc只在 read committed 和 repeatable read 兩個隔離級別下工作。其他兩個隔離級別夠和mvcc不相容,因為 read uncommitted 總是讀取最新的資料行,而不...
MySQL 事務 隔離級別 MVVC是怎麼回事?
事務會把資料庫從一種一致狀態轉換為另一種一致狀態。一致性隔離性 永續性帶有儲存點的扁平事務 鏈事務巢狀事務 分布式事務 事務的隔離性由鎖來實現。而原子性 一致性 永續性通過資料庫的redo log和undo log來完成。redo log稱為重做日誌,用來保證事務的原子性和永續性。undo log用...
mysql使用規範 MySQL使用規範 MySQL
bitscn.com mysql使用規範 一 核心規範 1.不用資料庫做運營,如md5 order by rand 2.控制單錶資料量 a 單錶純int不超過1000w b 單錶含char不超過500w c 單庫不超過300 400個表 3.表字段數少而精 a 影響因素 i.io高效 ii.全表遍歷...