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