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