1. 程式人生 > >資料庫幻讀_髒讀_不可重複讀

資料庫幻讀_髒讀_不可重複讀

要理解幻讀、髒讀、不可重複讀,必須先搞清楚事務的隔離級別

事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。

隔離級別 髒讀 不可重複讀 幻讀
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

髒讀

當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。

髒讀就是讀到其他事務未提交的資料

資料庫的事務預設一般都是Read committed,所以髒讀現象很少發生

不可重複讀

在一個事務內,對同一條資料進去讀取,第一次讀取到的資料和第二次讀取到的資料不一致

產生不可重複讀的原因是,在兩次讀取資料之間,資料被其他事務修改了;第二次讀取的時候,讀取到了其他事務已提交的資料,發現前後兩次資料不一致了(即不能讀到相同的資料)

解決辦法

解決辦法是,在第一次讀取時,就鎖定資源,不讓其他事務修改

幻讀

已讀取的資料,在事務過程中被其他事務修改,在本事務兩次讀取的資料不一致

在一個事務內,第一次讀取到的資料條數和第二次讀取到的資料條數不一致

產生幻讀的原因是:在兩次讀取資料之間,其他資料插入了新的資料;第二次讀取到的資料總數和第一次不一致(就像幻覺一樣)

解決辦法

幻讀現象一般不解決,在業務程式碼上做判斷即可;如果一定要解決,就只能鎖定所有相關的資源,鎖表或者增加分散式鎖,插入時也必須得到鎖才能操作

總結

髒讀很好理解,就是讀到其他事務未提交的資料

那麼不可重複讀和幻讀到底有什麼區別呢,看起來好像差不多

  • 不可重複讀,指的是同一條記錄兩次查詢中被其他事務修改了;
  • 幻讀,指的是兩次查詢中,其他事務插入了新資料