SQL 標(biāo)準(zhǔn)定義了四種隔離級別,MySQL 全都支持。這四種隔離級別分別是:
從上往下,隔離強(qiáng)度逐漸增強(qiáng),性能逐漸變差
1 讀未提交(READ UNCOMMITTED
MySQL 事務(wù)隔離其實(shí)是依靠鎖來實(shí)現(xiàn)的,加鎖自然會帶來性能的損失。而讀未提交隔離級別是不加鎖的,所以它的性能是最好的,沒有加鎖、解鎖帶來的性能開銷。但有利就有弊,這基本上就相當(dāng)于裸奔啊,所以它連臟讀的問題都沒辦法解決。
2 讀提交 (READ COMMITTED
讀提交就是一個(gè)事務(wù)只能讀到其他事務(wù)已經(jīng)提交過的數(shù)據(jù),也就是其他事務(wù)調(diào)用 commit 命令之后的數(shù)據(jù)。那臟數(shù)據(jù)問題就解決了。讀提交事務(wù)隔離級別是大多數(shù)流行數(shù)據(jù)庫的默認(rèn)事務(wù)隔離界別,比如 Oracle,但是不是 MySQL 的默認(rèn)隔離界別
3 可重復(fù)讀 (REPEATABLE READ)
事務(wù)不會讀到其他事務(wù)對已有數(shù)據(jù)的修改,即使其他事務(wù)已提交,也就是說,事務(wù)開始時(shí)讀到的已有數(shù)據(jù)是什么,在事務(wù)提交前的任意時(shí)刻,這些數(shù)據(jù)的值都是一樣的。但是,對于其他事務(wù)新插入的數(shù)據(jù)是可以讀到的,這也就引發(fā)了幻讀問題。
4 串行化 (SERIALIZABLE)
串行化是4種事務(wù)隔離級別中隔離效果最好的,解決了臟讀、可重復(fù)讀、幻讀的問題,但是效果最差,它將事務(wù)的執(zhí)行變?yōu)轫樞驁?zhí)行,與其他三個(gè)隔離級別相比,它就相當(dāng)于單線程,后一個(gè)事務(wù)的執(zhí)行必須等待前一個(gè)事務(wù)結(jié)束。

查看事務(wù)隔離級別
show variables like 'transaction_isolation';
設(shè)置全局事務(wù)隔離級別
set global transaction isolation level read committed;
設(shè)置當(dāng)前會話事務(wù)隔離級別
set session transaction isolation level repeatable read;
互聯(lián)網(wǎng)項(xiàng)目中mysql該如何選擇
Mysql默認(rèn)的事務(wù)隔離級別是可重復(fù)讀(Repeatable Read),那互聯(lián)網(wǎng)項(xiàng)目中Mysql也是用默認(rèn)隔離級別,不需要修改嗎?
先說結(jié)論:互聯(lián)網(wǎng)項(xiàng)目請用:讀已提交(Read Commited)這個(gè)隔離級別!
Read UnCommitted:一個(gè)事務(wù)讀到另一個(gè)事務(wù)未提交讀數(shù)據(jù),肯定不合適
Serializable:每個(gè)次讀操作都會加鎖,快照讀失效,性能不佳
原因一:
在RR隔離級別下,存在間隙鎖,導(dǎo)致出現(xiàn)死鎖的幾率比RC大的多!
原因二:
在RR隔離級別下,條件列未命中索引會鎖表!而在RC隔離級別下,只鎖行