這篇文章給大家分享的是有關(guān)MySQL中四種隔離級別分別是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)墊江,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
事務(wù)的隔離性比想象的要復(fù)雜,在 SQL 標(biāo)準(zhǔn)中定義了四種級別的隔離級別。通常而言,較低級別的隔離通??梢詧?zhí)行更高的并發(fā),系統(tǒng)的開銷也更低(推薦課程:MySQL視頻教程)
READ UNCOMMITTED
該級別為未提交讀。在該級別中,事務(wù)中的修改即使沒有提交,對其他事務(wù)也都是可見的。事務(wù)可以讀取未提交的數(shù)據(jù),這也被稱為臟讀。這個(gè)級別會(huì)導(dǎo)致很多的問題,從性能上來說,它不會(huì)比其他級別好太多,但缺乏其他級別的很多好處。除非真的有非常必要的理由,在實(shí)際應(yīng)用中一般很少使用。
READ COMMITTED
該級別為提交讀。大部分?jǐn)?shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別都是它,但 MySQL 不是。該級別滿足隔離性的簡單定義:一個(gè)事務(wù)開始時(shí),只能“看見”已經(jīng)提交的事務(wù)所做的修改。換而言之,一個(gè)事務(wù)從開始直到提交之前,所做的任何修改對其他事務(wù)都是不可見的。這個(gè)級別有時(shí)候也叫做不可重復(fù)讀,因?yàn)閮纱螆?zhí)行同樣的查詢,可能會(huì)得到不一樣的結(jié)果。
REPEATABLE READ
該級別為可重復(fù)讀,它是 MySQL 默認(rèn)的事務(wù)隔離級別。它解決了臟讀的問題,保證了在同一個(gè)事務(wù)中多次讀取同樣記錄的結(jié)果是一致的。
但是理論上,該級別卻無法解決另外一個(gè)問題:幻讀。所謂幻讀,指的是當(dāng)某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)的記錄時(shí),另外一個(gè)事務(wù)又在該范圍內(nèi)插入了新的記錄,當(dāng)之前的事務(wù)再次讀取該范圍的記錄時(shí),會(huì)產(chǎn)生幻行。
幻讀示例:第一個(gè)事務(wù)對一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,比如這種修改涉及到表中的“全部數(shù)據(jù)行”。同時(shí),第二個(gè) 事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入“一行新數(shù)據(jù)”。那么,以后就會(huì)發(fā)生操作第一個(gè) 事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣.
InnoDB存儲(chǔ)引擎通過多版本并發(fā)控制解決了幻讀的問題。
SERIALIZABLE
該級別為可串行化,是最高的隔離級別。它通過強(qiáng)制事務(wù)串行執(zhí)行,避免了前面說的幻讀問題。簡而言之,該級別會(huì)在讀取的每一行數(shù)據(jù)上都加鎖,所以可能導(dǎo)致大量的超時(shí)和鎖爭用問題。
實(shí)際應(yīng)用中也很少使用這個(gè)隔離級別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒有并發(fā)的情況下,才考慮采用該級別。
隔離級別 | 臟讀可能性 | 不可重復(fù)讀可能性 | 幻讀可能性 | 加鎖讀 |
---|---|---|---|---|
READ UNCOMMITTED | Yes | Yes | Yes | No |
READ COMMITTED | No | Yes | Yes | No |
REPEATABLE READ | No | No | Yes | No |
SERIALIZABLE | No | No | No | Yes |
感謝各位的閱讀!關(guān)于MySQL中四種隔離級別分別是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!