資料庫幻讀_髒讀_不可重複讀
阿新 • • 發佈:2018-11-26
要理解幻讀、髒讀、不可重複讀,必須先搞清楚事務的隔離級別
事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
髒讀
當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。
髒讀就是讀到其他事務未提交的資料
資料庫的事務預設一般都是Read committed,所以髒讀現象很少發生
不可重複讀
在一個事務內,對同一條資料進去讀取,第一次讀取到的資料和第二次讀取到的資料不一致
產生不可重複讀的原因是,在兩次讀取資料之間,資料被其他事務修改了;第二次讀取的時候,讀取到了其他事務已提交的資料,發現前後兩次資料不一致了(即不能讀到相同的資料)
解決辦法
解決辦法是,在第一次讀取時,就鎖定資源,不讓其他事務修改
幻讀
已讀取的資料,在事務過程中被其他事務修改,在本事務兩次讀取的資料不一致
在一個事務內,第一次讀取到的資料條數和第二次讀取到的資料條數不一致
產生幻讀的原因是:在兩次讀取資料之間,其他資料插入了新的資料;第二次讀取到的資料總數和第一次不一致(就像幻覺一樣)
解決辦法
幻讀現象一般不解決,在業務程式碼上做判斷即可;如果一定要解決,就只能鎖定所有相關的資源,鎖表或者增加分散式鎖,插入時也必須得到鎖才能操作
總結
髒讀很好理解,就是讀到其他事務未提交的資料
那麼不可重複讀和幻讀到底有什麼區別呢,看起來好像差不多
- 不可重複讀,指的是同一條記錄兩次查詢中被其他事務修改了;
- 幻讀,指的是兩次查詢中,其他事務插入了新資料