數據庫臟讀、幻讀


臟讀
一個事務讀取另一個事務未提交的數據:事務1讀取一條數據並做了修改,此時事務2讀取事務1已修改且未提交的數據;此時如果事務1回滾了修改操作,那么事務2讀取的數據就是臟數據
幻讀
一個事務按照相同的查詢條件重新讀取檢索過的數據,但發現有新的數據插入:事務1按照條件a檢索到b行數據,然后事務2再插入符合條件a的數據,當事務1再次按照條件a檢索數據時發現多了事務2插入的數據
丟失的修改
兩個事務同時修改了同一行數據並提交,其中一個事務覆蓋了另一個事務的修改。
不可重復讀
一個事務先后兩次讀取相同行的數據,發現數據不一致:事務1讀取a行數據,事務2修改或刪除部分或全部數據,事務1再次讀取到的數據和第一次讀取的的數據不一致。
解決辦法
出現以上問題是數據庫事務隔離級別的問題
SQL標准定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離一般支持更高的並發處理,並擁有更低的系統開銷。
在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,以為他的性能也不比其他級別好多少。讀取未提交的數據,也叫臟讀(dirty read)
這個是大多數數據庫系統的默認隔離級別(但不是MysQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別也支持所謂的不可重復讀(Nonrepeatable Read),應為同一事物的其他實例在該實例處理期間可能會有新的提交,所以同一個select可能返回不同結果。
這是MySQL的默認事務隔離級別,他確保統一事務的多個實例在並發讀取數據時,會看到同樣的數據行。不過理論上,這會導致另一個棘手的問題:幻讀(Phantom Read)。InnoDB和FaIcon存儲引擎通過多版本並發控制機制解決了這個問題。
這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超市現象和鎖競爭。


免責聲明!

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



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