原文:聊聊MySQL的隔離級(jí)別 | MySQL隔離級(jí)別原理
參考:oracle - mysql - 數(shù)據(jù)庫事務(wù)隔離級(jí)別介紹
參考寫的不全面囊扳, 按現(xiàn)在的理解快鱼,重新寫一個(gè)辨嗽;
一症歇、名詞解釋
臟讀:在一個(gè)查詢事務(wù)過程中猜扮,讀到了其它事務(wù)沒有提交的數(shù)據(jù)勉吻;
不可重復(fù)讀:一個(gè)事務(wù)查詢過程中,多次查詢得到了不一致的結(jié)果旅赢,原因是:有別的更新事務(wù)提交了齿桃;
幻讀:一個(gè)事務(wù)查詢過程中,多次查詢得到了不一致的結(jié)果煮盼,原因是:有別的刪除事務(wù)/插入事務(wù)提交了短纵;
二、數(shù)據(jù)庫隔離級(jí)別
ps:不能使用表格簡(jiǎn)直了僵控,只有截圖香到;
三、控制方式
讀未提交:每次都是讀數(shù)據(jù)最新的版本(包括事務(wù)未提交的數(shù)據(jù))报破;
讀已提交:MVCC控制悠就;
可重復(fù)讀:MVCC控制;
序列化:在讀取的每一行上加鎖泛烙,只能按順序進(jìn)行讀寫理卑;
四、InnoDB MVCC(多版本并發(fā)控制)原理
InnoDB引擎下的MVCC蔽氨,是通過在每一行上增加兩個(gè)隱藏列實(shí)現(xiàn)的藐唠;
每發(fā)生一個(gè)新的事務(wù)帆疟,系統(tǒng)版本都會(huì)遞增;
當(dāng)UPDATE數(shù)據(jù)的時(shí)候宇立,都是先copy出來一行操作踪宠,不影響原表數(shù)據(jù),提交之后才影響妈嘹;
一個(gè)保存創(chuàng)建時(shí)間(非時(shí)間值柳琢,而是系統(tǒng)版本號(hào));
一個(gè)保存刪除時(shí)間(非時(shí)間值润脸,而是系統(tǒng)版本號(hào))柬脸;
4.1 SELECT
當(dāng)前查詢事務(wù)系統(tǒng)ID:5
結(jié)果條件:
- CREATE VERSION <= 5(RR級(jí)別為 <= 5,RC級(jí)別應(yīng)該是直接取最大值);
- DELETE VERSION == null or DELETE VERSION > 5 (RR級(jí)別應(yīng)該只有為空毙驯,RC級(jí)別可能有 > 5的情況)倒堕;
1可以保證讀取到的行,在事務(wù)開始之前就已經(jīng)存在爆价,要么是事務(wù)自身插入或者修改的垦巴;
2可以保證讀取到的行,在事務(wù)開始之前未被刪除铭段;
4.2 INSERT
為新插入的每一行保存當(dāng)前系統(tǒng)版本號(hào)作為CREATE VERSION骤宣;
4.3 DELETE
為刪除的每一行保存當(dāng)前系統(tǒng)版本號(hào)作為DELETE VERSION;
4.4 UPDATE
插入一行新的記錄序愚,保存當(dāng)前系統(tǒng)版本號(hào)作為CREATE VERSION憔披;
同事保存當(dāng)前系統(tǒng)版本號(hào)到原來的行上作為DELETE VERSION;
五爸吮、參考:
- 《高性能MySQL》
- <a target="_blank">MySQL的四種事務(wù)隔離級(jí)別</a>(ps:此處有測(cè)試截圖活逆,比較直觀)