摘自 http://terje.blog.163.com/blog/static/11924371200952910206453/
以下是我從網(wǎng)上找的:臟讀dirty reads:當(dāng)事務(wù)讀取還未被提交的數(shù)據(jù)時,就會發(fā)生這種事件。舉例來說:Transaction 1 修改了一行數(shù)據(jù),然后 Transaction 2 在 Transaction 1 還未提交修改操作之前讀取了被修改的行。如果 Transaction 1 回滾了修改操作,那么 Transaction 2 讀取的數(shù)據(jù)就可以看作是從未存在過的。 不可重復(fù)的讀non-repeatable reads:當(dāng)事務(wù)兩次讀取同一行數(shù)據(jù),但每次得到的數(shù)據(jù)都不一樣時,就會發(fā)生這種事件。舉例來說:Transaction 1 讀取一行數(shù)據(jù),然后 Transaction 2 修改或刪除該行并提交修改操作。當(dāng) Transaction 1 試圖重新讀取該行時,它就會得到不同的數(shù)據(jù)值(如果該行被更新)或發(fā)現(xiàn)該行不再存在(如果該行被刪除)。 虛讀phantom read:如果符合搜索條件的一行數(shù)據(jù)在后面的讀取操作中出現(xiàn),但該行數(shù)據(jù)卻不屬于最初的數(shù)據(jù),就會發(fā)生這種事件。舉例來說:Transaction 1 讀取滿足某種搜索條件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索條件的一個新行。如果 Transaction 1 重新執(zhí)行產(chǎn)生原來那些行的查詢,就會得到不同的行。
數(shù)據(jù)庫帶來的并發(fā)問題包括:
1.丟失或覆蓋更新。(幻像讀)
2.未確認(rèn)的相關(guān)性(臟讀)。
3.不一致的分析(非重復(fù)讀)。
詳細(xì)描述如下:
一.丟失更新當(dāng)兩個或多個事務(wù)選擇同一行,然后基于最初選定的值更新該行時,會發(fā)生丟失更新問題。每個事務(wù)都不知道其它事務(wù)的存在。最后的更新將重寫由其它事務(wù)所做的更新,這將導(dǎo)致數(shù)據(jù)丟失。
e.g.事務(wù)A和事務(wù)B同時修改某行的值,
1.事務(wù)A將數(shù)值改為1并提交
2.事務(wù)B將數(shù)值改為2并提交。
這時數(shù)據(jù)的值為2,事務(wù)A所做的更新將會丟失。
解決辦法:對行加鎖,只允許并發(fā)一個更新事務(wù)。
二.未確認(rèn)的相關(guān)性(臟讀)當(dāng)?shù)诙€事務(wù)選擇其它事務(wù)正在更新的行時,會發(fā)生未確認(rèn)的相關(guān)性問題。第二個事務(wù)正在讀取的數(shù)據(jù)還沒有確認(rèn)并且可能由更新此行的事務(wù)所更改。
e.g.
1.Mary的原工資為1000, 財務(wù)人員將Mary的工資改為了8000(但未提交事務(wù)) 2.Mary讀取自己的工資 ,發(fā)現(xiàn)自己的工資變?yōu)榱?000,歡天喜地!
3.而財務(wù)發(fā)現(xiàn)操作有誤,回滾了事務(wù),Mary的工資又變?yōu)榱?000
像這樣,Mary記取的工資數(shù)8000是一個臟數(shù)據(jù)。
解決辦法:如果在第一個事務(wù)提交前,任何其他事務(wù)不可讀取其修改過的值,則可 以避免該問題。
三.不一致的分析(非重復(fù)讀)當(dāng)?shù)诙€事務(wù)多次訪問同一行而且每次讀取不同的數(shù)據(jù)時,會發(fā)生不一致的分析問題。不一致的分析與未確認(rèn)的相關(guān)性類似,因?yàn)槠渌聞?wù)也是正在更改第二個事務(wù)正在讀取的數(shù)據(jù)。然而,在不一致的分析中,第二個事務(wù)讀取的數(shù)據(jù)是由已進(jìn)行了更改的事務(wù)提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次信息都由其它事務(wù)更改;因而該行被非重復(fù)讀取。
在一個事務(wù)中前后兩次讀取的結(jié)果并不致,導(dǎo)致了不可重復(fù)讀。
e.g.
1.在事務(wù)1中,Mary 讀取了自己的工資為1000,操作并沒有完成
2.在事務(wù)2中,這時財務(wù)人員修改了Mary的工資為2000,并提交了事務(wù).
3.在事務(wù)1中,Mary 再次讀取自己的工資時,工資變?yōu)榱?000
解決辦法:如果只有在修改事務(wù)完全提交之后才可以讀取數(shù)據(jù),則可以避免該問題。
四.幻像讀
當(dāng)對某行執(zhí)行插入或刪除操作,而該行屬于某個事務(wù)正在讀取的行的范圍時,會發(fā)生幻像讀問題。事務(wù)第一次讀的行范圍顯示出其中一行已不復(fù)存在于第二次讀或后續(xù)讀中,因?yàn)樵撔幸驯黄渌聞?wù)刪除。同樣,由于其它事務(wù)的插入操作,事務(wù)的第二次或后續(xù)讀顯示有一行已不存在于原始讀中。
e.g.目前工資為1000的員工有10人。
1.事務(wù)1,讀取所有工資為1000的員工。
2.這時事務(wù)2向employee表插入了一條員工記錄,工資也為1000
3.事務(wù)1再次讀取所有工資為1000的員工共讀取到了11條記錄,
解決辦法:如果在操作事務(wù)完成數(shù)據(jù)處理之前,任何其他事務(wù)都不可以添加新數(shù)據(jù),則可避免該問題
新聞熱點(diǎn)
疑難解答
圖片精選