新聞中心
正確理解MYSQL的幻讀
1、幻讀指的是一個(gè)事務(wù)在前后兩次查詢(xún)同一個(gè)范圍的時(shí)候,后一次查詢(xún)看到了前一次查詢(xún)沒(méi)有看到的行。首先快照讀是不存在幻讀的,只有當(dāng)前讀(實(shí)時(shí)讀)才存在幻讀的問(wèn)題。
我們提供的服務(wù)有:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、成華ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的成華網(wǎng)站制作公司
2、首先需要明確的就是“幻讀”概念: 隔離級(jí)別是可重復(fù)讀,在一個(gè)事務(wù)中前后兩次查詢(xún),查到了其他事務(wù)insert進(jìn)來(lái)的數(shù)據(jù)。 強(qiáng)調(diào)的是讀取到了其他事務(wù)插入進(jìn)來(lái)的數(shù)據(jù)。
3、幻讀是指:在一個(gè)事務(wù)中,讀取到了其他已經(jīng)提交的事務(wù)插入的數(shù)據(jù)行。MySQL在解決臟讀、不可重復(fù)的讀時(shí)候,使用了MVCC一致性視圖,同時(shí)配合行鎖來(lái)解決。
4、). 幻讀 :是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。
5、最終的表數(shù)據(jù)如下:打開(kāi)兩個(gè)終端,連上mysql,分別啟動(dòng)事務(wù)a和事務(wù)b。在事務(wù)a和事務(wù)b上面分別執(zhí)行如下命令:查詢(xún)出來(lái)的結(jié)果如下: 事務(wù)a:事務(wù)b:很明顯事務(wù)b沒(méi)有查詢(xún)到事務(wù)a未提交的新插入數(shù)據(jù)。
6、據(jù)此,很多人判斷說(shuō)RR隔離級(jí)別下“不存在”幻讀。但果真如此嗎?--- 出現(xiàn)上面的試驗(yàn)結(jié)果,是因?yàn)樵赗R隔離級(jí)別事務(wù)下,Mysql會(huì)對(duì)前一次select的結(jié)果快照。
既然MySQL中InnoDB使用MVCC,為什么REPEATABLE-READ不能消除幻讀
所以說(shuō)InnoDB的RR隔離級(jí)別沒(méi)有或者解決了幻讀問(wèn)題都不太準(zhǔn)確。應(yīng)該說(shuō)它并沒(méi)有完全解決幻讀的問(wèn)題。如果在同一個(gè)事務(wù)里面,只是總是執(zhí)行普通的select快照讀,是不會(huì)產(chǎn)生幻讀的。
mysql默認(rèn)的repeatable-read隔離級(jí)別說(shuō)的是A事務(wù)在執(zhí)行過(guò)程中可以看到B事務(wù)插入的已提交的數(shù)據(jù),不能看到B事務(wù)update提交的數(shù)據(jù)。
快照讀: 通過(guò)MVCC實(shí)現(xiàn),該技術(shù)不僅可以保證innodb的可重復(fù)讀,而且可以防止幻讀,但是他讀取的數(shù)據(jù)雖然是一致的,但是數(shù)據(jù)是歷史數(shù)據(jù)。
innoDB是聚簇索引,數(shù)據(jù)掛在逐漸索引之下。是 MySQL 默認(rèn)的事務(wù)型存儲(chǔ)引擎, 只有在需要它不支持的特性時(shí),才考慮使用其它存儲(chǔ)引擎 。實(shí)現(xiàn)了四個(gè)標(biāo)準(zhǔn)的隔離級(jí)別,默認(rèn)級(jí)別是可重復(fù)讀(REPEATABLE READ)。
針對(duì)上面的現(xiàn)象我們進(jìn)行個(gè)原理分析: 實(shí)際上產(chǎn)生上述顯現(xiàn)是因?yàn)镮nnoDB采用的MVCC(多版本并發(fā)控制),其中針對(duì)每條數(shù)據(jù)會(huì)有它自己的事務(wù)id,以及一個(gè)最大事務(wù)id。針對(duì)事務(wù)中數(shù)據(jù)每次修改,會(huì)產(chǎn)生不同的版本。
此外要提的一點(diǎn)是,MySql的REPEATABLE READ與Oracle的不同,不但解決了不可重復(fù)讀問(wèn)題,還解決的“幻讀”問(wèn)題。
Mysql:RR隔離級(jí)別下的幻讀
可以看到事務(wù)a已提交的新數(shù)據(jù)被事務(wù)b使用update語(yǔ)句更新了,并且通過(guò)普通的select語(yǔ)句給查詢(xún)出來(lái)了,很顯然,出現(xiàn)了幻讀 。所以說(shuō)InnoDB的RR隔離級(jí)別沒(méi)有或者解決了幻讀問(wèn)題都不太準(zhǔn)確。應(yīng)該說(shuō)它并沒(méi)有完全解決幻讀的問(wèn)題。
先明確一下,for update語(yǔ)法就是當(dāng)前讀,也就是查詢(xún)當(dāng)前已經(jīng)提交的數(shù)據(jù),并且是帶悲觀鎖的。沒(méi)有for update就是快照讀,也就是根據(jù)readView讀取的undolog中的數(shù)據(jù)。 如果按照以上猜想,那么整個(gè)執(zhí)行結(jié)果就違背了 可重復(fù)讀 的隔離級(jí)別了。
MySQL InnoDB 存儲(chǔ)引擎的默認(rèn)支持的隔離級(jí)別是 REPEATABLE-READ(可重讀) 。
標(biāo)題名稱(chēng):mysql怎么解決幻讀 mysql怎么解決幻讀和臟讀
網(wǎng)頁(yè)網(wǎng)址:http://ef60e0e.cn/article/dieogod.html