一、什么是臟讀、不可重復讀、幻讀
臟讀(Dirty Read)是指在數據庫事務中,一個事務讀取了另一個未提交事務中的數據。當一個事務修改數據但還沒有提交時,另一個事務讀取了這個未提交的數據。如果未提交的事務最終被回滾,那么另一個事務讀取到的數據實際上是無效的或錯誤的。臟讀可能導致不一致的數據狀態和不正確的結果。
不可重復讀(Non-repeatable Read)是指在數據庫事務中,一個事務在相同的查詢中多次讀取同一行數據,但在這個過程中,另一個事務修改或刪除了該行數據,導致兩次讀取的結果不一致。這種情況下,事務在多次讀取之間發生了不一致的變化,從而產生了不可重復的結果。
幻讀(Phantom Read)是指在數據庫事務中,一個事務在相同的查詢條件下多次執行查詢,但在這個過程中,另一個事務插入、修改或刪除了符合該查詢條件的數據,導致多次查詢的結果集發生變化。這種情況下,事務發現了一些之前不存在的行或丟失了一些之前存在的行,就好像發生了幻覺一樣。
臟讀、不可重復讀和幻讀都是由于并發事務執行時的數據訪問沖突而導致的。為了解決這些問題,數據庫提供了不同的隔離級別(如讀未提交、讀已提交、可重復讀和串行化),可以通過設置適當的隔離級別來控制事務之間的數據可見性和一致性,從而避免臟讀、不可重復讀和幻讀的問題。