欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

mysql幻讀底層實(shí)現(xiàn)方案

MySQL幻讀底層實(shí)現(xiàn)方案

什么是MySQL幻讀?

MySQL幻讀是指在一個(gè)事務(wù)中多次執(zhí)行同一個(gè)查詢,但每次查詢返回的記錄數(shù)不同。這種現(xiàn)象被稱為“幻讀”,因?yàn)榫拖袷浅霈F(xiàn)了幻覺一樣,你在執(zhí)行同一個(gè)操作,但卻得到不同的結(jié)果。

幻讀的原因

幻讀的出現(xiàn)是由于隔離級(jí)別的實(shí)現(xiàn)機(jī)制不同,MySQL為了遵循SQL標(biāo)準(zhǔn),支持了多種隔離級(jí)別。在現(xiàn)實(shí)使用中,有些隔離級(jí)別采用了不同的實(shí)現(xiàn)方案,這也就導(dǎo)致了幻讀的可能出現(xiàn)。

MySQL幻讀的解決方案

MySQL采用MVCC機(jī)制來解決幻讀的問題,事務(wù)在讀取數(shù)據(jù)的時(shí)候是從當(dāng)前版本中讀取數(shù)據(jù),如果更新數(shù)據(jù),則需要將當(dāng)前的事務(wù)版本號(hào)更新,從而讓讀取到該數(shù)據(jù)的事務(wù)任然能夠讀到未被修改的數(shù)據(jù)。在讀取數(shù)據(jù)時(shí),除了當(dāng)前保存的數(shù)據(jù)版本號(hào),還有當(dāng)前事務(wù)的版本號(hào),如果事務(wù)的版本號(hào)落后于保存數(shù)據(jù)的版本號(hào),這時(shí)將會(huì)被視為幻讀,MySQL會(huì)根據(jù)MVCC機(jī)制,返回最新的數(shù)據(jù)。

MVCC具體實(shí)現(xiàn)

在MySQL中,MVCC是通過在每一行記錄后面添加一個(gè)隱藏的版本號(hào)實(shí)現(xiàn)的。在插入新數(shù)據(jù)時(shí),新數(shù)據(jù)的版本號(hào)是最新的,讀數(shù)據(jù)時(shí),只顯示版本號(hào)小于等于當(dāng)前事務(wù)版本號(hào)的數(shù)據(jù),刪除數(shù)據(jù)時(shí),不是真正的刪除,而是給該數(shù)據(jù)添加一個(gè)版本號(hào),使得其對(duì)事務(wù)仍然可見,更新數(shù)據(jù)時(shí),也僅僅是添加一個(gè)新的版本號(hào),而非真正的覆蓋。當(dāng)然,為了避免數(shù)據(jù)過多,MySQL也會(huì)定時(shí)清理被刪除的數(shù)據(jù)。

總結(jié)

MySQL幻讀是出現(xiàn)在多個(gè)事務(wù)同時(shí)對(duì)同一數(shù)據(jù)進(jìn)行讀寫時(shí)的一種現(xiàn)象,解決幻讀的最常用的方案是使用MVCC機(jī)制,MySQL也是基于MVCC實(shí)現(xiàn)的。通過添加隱藏版本號(hào)等技術(shù),MySQL保證了事務(wù)讀取到的數(shù)據(jù)版本是一致的,避免了幻讀現(xiàn)象的出現(xiàn)。