MySQL的事務隔離級別一共有四個,分別是讀未提交、讀已提交、可重復讀以及可串行化。
MySQL的隔離級別的作用就是讓事務之間互相隔離,互不影響,這樣可以保證事務的一致性。
隔離級別比較:可串行化>可重復讀>讀已提交>讀未提交
隔離級別對性能的影響比較:可串行化>可重復讀>讀已提交>讀未提交
讀未提交(READ UNCOMMITTED):在讀未提交隔離級別下,A可以讀取到B修改過但未提交的資料。(該級別隔離的資料庫可能發生臟讀、不可重復讀和幻讀問題,一般很少使用此隔離級別。)
臟讀(Dirty Read):一個事物讀到另一個未提交事物修改過的資料。
舉例:過年了,老板準備給公司的每個員工發獎金。老板準備給小剛發2000元的獎金但是由于輸入錯誤輸入的是5000元,但是還未提交轉賬。這時小剛剛好看自己今年的獎金額度為5000一下子高興壞了。連忙和自己好友小明分享還決定下班請小明喝奶茶,下班后老板宣布大家的獎金都發用戶卡里了,小剛連忙打開手機一看銀行卡收款2000元,一下子有點失落。
讀已提交(READ COMMITTED):在讀已提交隔離級別下,B只能在A修改過并且已提交后才能讀取到事務B修改的資料。(解決了臟讀的問題,但可能發生不可重復讀和幻讀問題,一般很少使用此隔離級別。)
幻讀(Phantom):一個事務先根據某些條件查詢出一些記錄,之后另一個事務又向表中插入了符合這些條件的記錄,原先的事務再次按照該條件查詢時,能把另一個事務插入的記錄也讀出來。(幻讀在讀未提交、讀已提交、可重復讀隔離級別都可能會出現)
舉例:小付訓是請小明去奶茶店喝了奶茶,但是由于小明的獎金比小剛多,結果小明給小剛買了單一個23元。小明回到家和老婆說他發了工資和獎金一共有34210元,剛剛和好友小剛喝奶茶花了23元還剩34187元,并把銀行卡消費記錄給老婆看,就在這時小剛想著不行明明就是他說要請小明喝奶茶的,于是決定要把錢發給小明,但是發微信怕他不收結果就直接支付寶轉賬,這時小明老婆看到的賬單中突然又多了一個轉賬收款23元。
不可重復讀:(Non-Repeatable Read):一個事務只能讀到另一個已經提交的事務修改過的資料,并且其他事務每對該資料進行一次修改并提交后,該事務都能查詢得到最新值。(不可重復讀在讀未提交和讀已提交隔離級別都可能會出現)
可重復讀REPEATABLE READ):在可重復讀隔離級別下,事務B只能在事務A修改過資料并提交后,自己也提交事務后,才能讀取到事務B修改的資料。
可串行化(序列化)(SERIALIZABLE):各種問題(臟讀、不可重復讀、幻讀)都不會發生,通過加鎖實作(讀鎖和寫鎖)。
總結:
·Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生。
·Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。
·Read committed (讀已提交):可避免臟讀的發生。
·Read uncommitted (讀未提交):最低級別,任何情況都無法保證。
以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,級別越高,執行效率就越低。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/167244.html
標籤:疑難問題
