什么是幻讀
幻讀是指一個事務在查詢某個范圍的記錄時,另外一個并發事務插入了新的記錄,導致第一個事務重新查詢時,范圍內發現了新的記錄,實際上這些記錄在第一個事務開始查詢時是不存在的。
mysql中幻讀的解決方案
MySQL中提供了兩種解決幻讀的方案:隔離級別和MVCC(多版本并發控制)。
隔離級別
隔離級別是指同時執行的事務之間的隔離程度。MySQL中提供了4種隔離級別,可以通過設置參數來指定隔離級別:
- 讀未提交:事務A可以讀到事務B未提交的更新
- 讀已提交:事務A只能讀到事務B已提交的更新
- 可重復讀:事務A在執行期間多次讀取同一條記錄時,所讀取的結果是一致的
- 串行化:最高的隔離級別,所有事務串行執行,避免了幻讀問題
MVCC
MVCC是指在同一個時間點不同的事務對同一張表進行操作,每個事務看到的數據是不同的,因為MySQL會為每個事務創建一個數據快照。
當一個事務需要讀取數據時,系統首先會把該事務的開始時間記下來,然后將該時間點之前的所有數據都復制一份到一個新的地方,并且該事務只能讀取到這個新的數據快照,而不會被其他事務所影響。
總結
幻讀是數據庫中常見的問題之一,mysql提供了解決幻讀問題的兩種方案:隔離級別和MVCC,具體選用哪種方案需要根據實際情況進行評估。
下一篇css最高類