一、臟讀、不可重復(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ù)不一樣