臟讀、不可重復(fù)讀、幻讀

一、臟讀、不可重復(fù)讀、幻讀

1、臟讀:臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時(shí),另外一個(gè)事務(wù)也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。

例如:

張三的工資為5000,事務(wù)A中把他的工資改為8000,但事務(wù)A尚未提交。

與此同時(shí),

事務(wù)B正在讀取張三的工資,讀取到張三的工資為8000。

隨后,

事務(wù)A發(fā)生異常,而回滾了事務(wù)。張三的工資又回滾為5000。

最后,

事務(wù)B讀取到的張三工資為8000的數(shù)據(jù)即為臟數(shù)據(jù),事務(wù)B做了一次臟讀。

2、不可重復(fù)讀:是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。

例如:

在事務(wù)A中,讀取到張三的工資為5000,操作沒有完成,事務(wù)還沒提交。

與此同時(shí),

事務(wù)B把張三的工資改為8000,并提交了事務(wù)。

隨后,

在事務(wù)A中,再次讀取張三的工資,此時(shí)工資變?yōu)?000。在一個(gè)事務(wù)中前后兩次讀取的結(jié)果并不致,導(dǎo)致了不可重復(fù)讀。

3、幻讀:是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。

例如:

目前工資為5000的員工有10人,事務(wù)A讀取所有工資為5000的人數(shù)為10人。

此時(shí),

事務(wù)B插入一條工資也為5000的記錄。

這是,事務(wù)A再次讀取工資為5000的員工,記錄為11人。此時(shí)產(chǎn)生了幻讀。

4、提醒

不可重復(fù)讀的重點(diǎn)是修改:

同樣的條件,你讀取過的數(shù)據(jù),再次讀取出來發(fā)現(xiàn)值不一樣了

幻讀的重點(diǎn)在于新增或者刪除:

同樣的條件,第 1 次和第 2 次讀出來的記錄數(shù)不一樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容