並發數據庫事務缺鎖導致的數據不一致情況:丟失更新,臟讀,不可重復讀,幻讀


參考鏈接:  

https://www.cnblogs.com/lenther2002/p/4487123.html

http://www.jianshu.com/p/d8bc0a843dd0

http://blog.csdn.net/qq_36074150/article/details/76902737

https://www.cnblogs.com/itcomputer/articles/5133254.html

 

 

這些問題的出現的原因
之所以出現更新丟失,臟讀,不可重復讀,幻讀,是因為當兩個事務同時進行數據庫操作的時候,兩者之間互相不知道對方的存在,對自身所處的環境過分樂觀,從而沒有對操作的數據做一定的保護處理,最終導致一些問題的出現。

 

 

丟失更新:一個事務讀取數據並提交修改,覆蓋了從上次讀取之后其他事務提交的修改(不是基於最新的數據進行修改)


圖中:事務A在T6提交的120, 這個120是在T2讀取的100的基礎上加上20, 而此事務B已經將100改為110,  所以 此時提交120, 會將事務B的修改覆蓋掉

解決方法:通過樂觀鎖可以解決這個問題,在T6提交階段,先判斷下原數據是否修改過

 

 

臟讀:一個事務讀到另外一個事務還沒有提交的數據。

臟讀又稱無效數據的讀出,是指在數據庫訪問中,事務T1將某一值修改,然后事務T2讀出該值,此后T1因為某種原因撤銷對該值的修改,這就導致了T2所讀到的數據是無效的。


圖中,原始數據age位20, 事務b將其修改成21,此時尚未提交,事務A讀取到age為21, 之后事務B又將修改撤銷,  事務A讀到的age=21是臟數據

 

 

解決方法:把事務隔離級別調整到read commited

 

 

不可重復讀:一個事務2次讀取一條記錄之間有其他事務修改了改記錄,導致2次讀取的結果不一樣

不可重復讀:是指一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據,那么,在第一個事務中的兩次讀數據之間,由於第二個事務的修改,那么第一個事務兩次讀到的數據可能是不一樣的,這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為不可重復讀。

重點: 一條記錄,  其他事務修改

圖中,事務A第一次讀取的age是20, 第二次讀取的是21

 

解決方法:把事務隔離級別調整到REPEATABLE READ。

 

 

幻讀:一個事務2次讀取多條記錄之間有其他事務進行了添加或刪除的操作,導致2次讀取記錄的數量不一致

幻讀和不可重復讀類似,都是指2次讀取的內容不一致,但是不可重復讀是讀取一條記錄,而幻讀是讀取多條記錄

重點:多條記錄, 其他事務新增或刪除

 


圖中,事務A第一次查詢有2條記錄,第二次查詢有3條記錄。

 

解決方法:把事務隔離級別調整到SERIALIZABLE

 

 

讀寫提交

 




 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM