1.臟讀:
指一個事務A正在訪問數據,並且對該數據進行了修改,但是這種修改還沒有提交到數據庫中(也可能因為某些原因Rollback了)。這時候另外一個事務B也訪問這個數據,然后使用了這個被A修改的數據,那么這個數據就是臟的,並不是數據庫中真實的數據。這就被稱作臟讀。
解決辦法:把數據庫事務隔離級別調整到READ_COMMITTED
即讓用戶在更新時鎖定數據庫,阻止其他用戶讀取,直到更新全部完成才讓你讀取。
2.幻讀:
指一個事務A對一個表中的數據進行了修改,而且該修改涉及到表中所有的數據行;同時另一個事務B也在修改表中的數據,該修改是向表中插入一行新數據。那么經過這一番操作之后,操作事務A的用戶就會發現表中還有沒修改的數據行,就像發生了幻覺一樣。這就被稱作幻讀。
解決辦法:把數據庫事務隔離級別調整到SERIALIZABLE_READ
3.不可重復讀:
指在一個事務A內,多次讀同一個數據,但是事務A沒有結束時,另外一個事務B也訪問該同一數據。那么在事務A的兩次讀數據之間,由於事務B的修改導致事務A兩次讀到的數據可能是不一樣的。這就發生了在一個事務內兩次讀到的數據不一樣,這就被稱作不可重復讀。
解決辦法:把數據庫事務隔離級別調整到REPEATABLE_READ
注:
級別高低:臟讀 < 不可重復讀 < 幻讀
所以設置了最高級別的SERIALIZABLE_READ就不需要設置其他的了,即解決了幻讀問題那么臟度和不可重復讀自然就都解決了。