時間:2024-03-08 08:50作者:下載吧人氣:16
在 MySQL 中事務(wù)的隔離級別有以下 4 種:
MySQL 默認的事務(wù)隔離級別是可重復(fù)讀(REPEATABLE READ),這 4 種隔離級別的說明如下。
讀未提交,也叫未提交讀,該隔離級別的事務(wù)可以看到其他事務(wù)中未提交的數(shù)據(jù)。該隔離級別因為可以讀取到其他事務(wù)中未提交的數(shù)據(jù),而未提交的數(shù)據(jù)可能會發(fā)生回滾,因此我們把該級別讀取到的數(shù)據(jù)稱之為臟數(shù)據(jù),把這個問題稱之為臟讀。
讀已提交,也叫提交讀,該隔離級別的事務(wù)能讀取到已經(jīng)提交事務(wù)的數(shù)據(jù),因此它不會有臟讀問題。但由于在事務(wù)的執(zhí)行中可以讀取到其他事務(wù)提交的結(jié)果,所以在不同時間的相同 SQL 查詢中,可能會得到不同的結(jié)果,這種現(xiàn)象叫做不可重復(fù)讀。
可重復(fù)讀,是 MySQL 的默認事務(wù)隔離級別,它能確保同一事務(wù)多次查詢的結(jié)果一致。但也會有新的問題,比如此級別的事務(wù)正在執(zhí)行時,另一個事務(wù)成功的插入了某條數(shù)據(jù),但因為它每次查詢的結(jié)果都是一樣的,所以會導(dǎo)致查詢不到這條數(shù)據(jù),自己重復(fù)插入時又失敗(因為唯一約束的原因)。明明在事務(wù)中查詢不到這條信息,但自己就是插入不進去,這就叫幻讀 (Phantom Read)。
序列化,事務(wù)最高隔離級別,它會強制事務(wù)排序,使之不會發(fā)生沖突,從而解決了臟讀、不可重復(fù)讀和幻讀問題,但因為執(zhí)行效率低,所以真正使用的場景并不多。?
簡單總結(jié)一下,MySQL 的 4 種事務(wù)隔離級別對應(yīng)臟讀、不可重復(fù)讀和幻讀的關(guān)系如下:
事務(wù)隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
讀未提交(READ UNCOMMITTED) | √ | √ | √ |
讀已提交(READ COMMITTED) | × | √ | √ |
可重復(fù)讀(REPEATABLE READ) | × | × | √ |
串行化(SERIALIZABLE) | × | × | × |
只看以上概念會比較抽象,接下來,咱們一步步通過執(zhí)行的結(jié)果來理解這幾種隔離級別的區(qū)別。
網(wǎng)友評論