數據庫的臟讀、幻讀、不可重復讀


1.臟讀:

指一個事務A正在訪問數據,並且對該數據進行了修改,但是這種修改還沒有提交到數據庫中(也可能因為某些原因Rollback了)。這時候另外一個事務B也訪問這個數據,然后使用了這個被A修改的數據,那么這個數據就是臟的,並不是數據庫中真實的數據。這就被稱作臟讀。

解決辦法:把數據庫事務隔離級別調整到READ_COMMITTED

即讓用戶在更新時鎖定數據庫,阻止其他用戶讀取,直到更新全部完成才讓你讀取。

2.幻讀:

指一個事務A對一個表中的數據進行了修改,而且該修改涉及到表中所有的數據行;同時另一個事務B也在修改表中的數據,該修改是向表中插入一行新數據。那么經過這一番操作之后,操作事務A的用戶就會發現表中還有沒修改的數據行,就像發生了幻覺一樣。這就被稱作幻讀。

解決辦法:把數據庫事務隔離級別調整到SERIALIZABLE_READ

3.不可重復讀:

指在一個事務A內,多次讀同一個數據,但是事務A沒有結束時,另外一個事務B也訪問該同一數據。那么在事務A的兩次讀數據之間,由於事務B的修改導致事務A兩次讀到的數據可能是不一樣的。這就發生了在一個事務內兩次讀到的數據不一樣,這就被稱作不可重復讀。

解決辦法:把數據庫事務隔離級別調整到REPEATABLE_READ

注:

級別高低:臟讀 < 不可重復讀 < 幻讀

所以設置了最高級別的SERIALIZABLE_READ就不需要設置其他的了,即解決了幻讀問題那么臟度和不可重復讀自然就都解決了。


免責聲明!

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



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