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

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

本文來自 : https://mp.weixin.qq.com/s/vkMG5A_DhMs7_wGUzgE1JA

 

髒讀。是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交(commit)到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料,那麼另外一個事務讀到的這個資料是髒資料,依據髒資料所做的操作可能是不正確的。

 

 

不可重複讀。是指在資料庫訪問中,一個事務範圍內兩個相同的查詢卻返回了不同資料。這是由於查詢時系統中其他事務修改的提交而引起的。比如事務T1讀取某一資料,事務T2讀取並修改了該資料,T1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。

 

 

幻讀。指同一個事務內多次查詢返回的結果集不一樣(比如增加了或者減少了行記錄)。比如同一個事務A內第一次查詢時候有n條記錄,但是第二次同等條件下查詢卻又n+1條記錄,這就好像產生了幻覺。

 

 

要想解決髒讀、不可重複讀、幻讀等讀現象,那麼就需要提高事務的隔離級別。但與此同時,事務的隔離級別越高,併發能力也就越低。所以,還需要讀者根據業務需要進行權衡。

總結

事務的隔離性上,從低到高可能產生的讀現象分別是:髒讀、不可重複讀、幻讀。

髒讀指讀到了未提交的資料。

不可重複讀指一次事務內的多次相同查詢,讀取到了不同的結果。

幻讀師不可重複讀的特殊場景。一次事務內的多次範圍查詢得到了不同的結果。

通過在寫的時候加鎖,可以解決髒讀。

通過在讀的時候加鎖,可以解決不可重複讀。

通過序列化,可以解決幻讀。