1. 程式人生 > 其它 >髒讀、幻讀、不可重複讀的定義和區別

髒讀、幻讀、不可重複讀的定義和區別

髒讀:事務A正在訪問資料並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務B也訪問這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料,那麼事務B讀到的這個資料是髒資料,依據髒資料所做的操作可能是不正確的。【事務B讀取到了事務A沒有提交的資料】

不可重複讀:事務A在執行讀取操作,由整個事務A比較大,前後讀取同一條資料需要經歷很長的時間 。在事務A第一次讀取資料後,事務B執行了更改操作,事務A第二次讀取到該值時發現和之前的資料不一樣,系統不可以讀取到重複的資料,稱為不可重複讀。【同一個事務中重複讀取時獲得的資料不同】

幻讀:事務A在執行讀取操作,需要兩次統計資料的總量,前一次查詢資料總量後,此時事務B執行了新增資料的操作並提交後,而後事務A第二次讀取的資料總量和之前統計的不一樣,就像產生了幻覺一樣,平白無故的多了幾條資料,稱為幻讀。【前後多次讀取,資料總量不一致】

不可重複讀的重點在修改,在同一事務中,同樣的條件,第一次讀取的資料和第二次讀取的資料不一樣(因為中間有其他事務提交了修改) 幻讀的重點在刪除和插入,在同一事務中,同樣的條件,第一次讀取的記錄數第二次讀取的記錄數不一致(因為中間有其他事務提交了插入和刪除操作)
不可重複讀關鍵在於特定的某個資料發生了變化,而幻讀關鍵在於整體的資料量發生了變化。

資料庫中四大隔離級別:read_uncommitted讀未提交,read_committed讀已提交,repeatable_read重複讀,serializable序列化(即序列訪問)
其中:
read_uncommitted級別最低,不能解決髒讀、不可重複讀、幻讀。
read_committed

可以解決髒讀,不能解決不可重複讀、幻讀。
repeatable_read可以解決髒讀、不可重複讀,但不能避免幻讀。
serializable隔離級別最高,可以避免髒讀、不可重複讀、幻讀,但是效率低下。

SQL Server和Oracle預設隔離級別為read_committed,而Mysql預設隔離級別為repeatable_read。