MySQL 四大隔離級(jí)別(從低到高)
讀未提交(Read Uncommitted)
讀已提交(Read Committed)
可重復(fù)讀(Repeatable Read)
串行化(Serializable)
1. 讀未提交(Read Uncommitted)
一個(gè)事務(wù)能讀到另一個(gè)事務(wù)未提交的數(shù)據(jù)
問題:臟讀
實(shí)際:基本不用
2. 讀已提交(Read Committed)
只能讀到別的事務(wù)已經(jīng)提交的數(shù)據(jù)
解決:臟讀
問題:不可重復(fù)讀(同一事務(wù)內(nèi)兩次查詢結(jié)果不一樣)
實(shí)際:Oracle、SQL Server 默認(rèn)
3. 可重復(fù)讀(Repeatable Read)默認(rèn)
同一個(gè)事務(wù)里,多次讀取結(jié)果一致
解決:臟讀、不可重復(fù)讀
問題:幻讀(InnoDB 靠 MVCC 很大程度避免了幻讀)
實(shí)際:MySQL InnoDB 默認(rèn)級(jí)別
4. 串行化(Serializable)
事務(wù)排隊(duì)執(zhí)行,完全串行
解決所有問題:臟讀、不可重復(fù)讀、幻讀
問題:性能極差,并發(fā)基本廢掉
實(shí)際:極少用,只有強(qiáng)一致場(chǎng)景才用
如何使用
# 當(dāng)前會(huì)話級(jí)別(只對(duì)本次連接生效,斷開就沒)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
#全局級(jí)別(對(duì)新連接生效,已連接的不變)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
#mysqld
transaction-isolation = READ-COMMITTED
MySQL 默認(rèn):可重復(fù)讀(RR),靠 MVCC 實(shí)現(xiàn)
Oracle 默認(rèn):讀已提交(RC),不支持真正的 RR
兩者都支持:讀未提交、讀已提交、串行化
Oracle 設(shè) REPEATABLE READ 等價(jià)于 SERIALIZABLE
隔離級(jí)別和悲樂鎖的關(guān)系
隔離級(jí)別是目標(biāo),悲觀鎖、樂觀鎖是實(shí)現(xiàn)這個(gè)目標(biāo)的兩種方式。

image.png