Mysql &Oracle隔離級(jí)別

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容