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

image.png