共計(jì) 1276 個(gè)字符,預(yù)計(jì)需要花費(fèi) 4 分鐘才能閱讀完成。
本篇內(nèi)容主要講解“SQL92 標(biāo)準(zhǔn)隔離級(jí)別有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓丸趣 TV 小編來帶大家學(xué)習(xí)“SQL92 標(biāo)準(zhǔn)隔離級(jí)別有哪些”吧!
定義
Read uncommitted (讀取未提交內(nèi)容)
在 Read uncommitted 級(jí)別,事務(wù)中的修改,即使沒有提交,對(duì)其他事務(wù)也都是可見的。事務(wù)可以讀取未提交的數(shù)據(jù),這也成為臟讀(Dirty read)。這個(gè)級(jí)別會(huì)導(dǎo)致很多問題,從性能上說 Read uncommitted 不會(huì)比其他的級(jí)別好太多,但缺乏其他級(jí)別的好多好處,除非有非常必要的理由,在實(shí)際的應(yīng)用中一般很少使用。
Read committed (讀取提交內(nèi)容)
大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級(jí)別都是 Read committed(但是 MySQL 不是)。Read committed 滿足前面提到的隔離性的簡(jiǎn)單定義:一個(gè)事務(wù)開始時(shí),只能看到已經(jīng)提交的事務(wù)所做的修改。換句話說,一個(gè)事務(wù)從開始到提交之前,所做的任何修改對(duì)其他事務(wù)都是不可見的。這個(gè)級(jí)別有時(shí)候也叫做不可重復(fù)的(Nonrepeatable read),因?yàn)閮纱螆?zhí)行同樣的查詢,可能會(huì)得到不一樣的結(jié)果。
Repeatable read (可重復(fù)讀)
Repeatable read 解決了臟讀問題。該級(jí)別保證了在同一個(gè)事務(wù)中多次讀取同樣的記錄的結(jié)果是一致的。但是,理論上,可重復(fù)讀隔離級(jí)別還是無法解決另一個(gè)幻讀(Phantom read)的問題。所謂幻讀,指的是當(dāng)某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)的記錄時(shí),另外一個(gè)事務(wù)又在該范圍內(nèi)插入了新的記錄,當(dāng)之前的事務(wù)再次讀取該范圍的記錄時(shí),會(huì)產(chǎn)生幻行(Phantom row)。InnoDB 和 XtraDB 存儲(chǔ)引擎通過多版并發(fā)控制(MVCC,Multivesion Concurrency Control)解決了幻讀問題。
Repeatable read 是 Mysql 默認(rèn)的事務(wù)隔離級(jí)別,其中 InnoDB 主 要通過使用 MVVC 獲得高并發(fā),使用一種被稱為 next-key-locking 的策略來避免幻讀。
Serializable (可串行化)
Serializable 是最高的隔離級(jí)別。它通過強(qiáng)制事務(wù)串行,避免了前面說的幻讀問題。簡(jiǎn)單的來說,Serializable 會(huì)在讀的每一行數(shù)據(jù)上都加上鎖,所以可能導(dǎo)致大量的超時(shí)和鎖征用問題。實(shí)際應(yīng)用中也很少用到這個(gè)隔離級(jí)別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒有并發(fā)的情況,才可考慮用該級(jí)別。
隔離級(jí)別
ANSI SQL92 P68-69
Level (隔離級(jí)別)Dirty read (臟讀)Non-repeatable read (不可重復(fù)讀)Phantom (幻讀)Read uncommitted (讀取未提交內(nèi)容)???Read committed (讀取提交內(nèi)容)×??Repeatable read (可重復(fù)讀)××?Serializable (可串行化)×××
到此,相信大家對(duì)“SQL92 標(biāo)準(zhǔn)隔離級(jí)別有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是丸趣 TV 網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!