數據庫並發事務存在的四個問題(更新丟失、臟讀、不可重復讀、幻讀)


如果不考慮事務隔離性,可能會發生以下情況

更新丟失:當兩個或多個事務選擇同一行,然后基於最初選定的值更新該行時,由於每個事務都不知道其他事務的存在,就會發生丟失更新問題一一最后的更新渡蓋了由其他事務所做的更新。(這就引發了並發並發線程安全問題,可以加了版本號,用cas樂觀鎖處理)

例如,兩個程序員修改同一java文件,每程序員獨立地更改其副本,然后保存更改后的副本,這樣就覆蓋了原始文檔。最后保存其更改副本的編輯人員覆蓋前一個程序員所做的更改

臟讀:事務a,讀到了事務b未提交的數據,如果事務a讀到了事務b的一些中間數據,待處理的數據。b事務數據還沒有提交,就被a事務訪問了,針對update操作

(解決方法:將 讀未提交 級別提高到 讀已提交 例如:orale在事務a 更新t表的時候,表t為鎖住的狀態,事務a未提交之前,事務b就不能訪問t表)

不可重復讀:指的是事務兩次讀取數據不一樣。因為中間被其他事務修改了。解決方法就是 將 級別提高到 可重復。使用行級鎖,鎖定當前記錄,其它事務無法更改。

幻讀:一個事務在查詢,另一個事務在做插入或者刪除,此時就會出現幻讀。導致表的總行數不一致的情況,針對insert或delete操作

 

事務的干擾級別:讀未提交、讀已提交、可重復讀、串行化。

 

隔離級別越高,性能越低

 

 

參考博客:

https://blog.csdn.net/fanzhigang0/article/details/93198059


免責聲明!

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



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