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