之前在開發中遇到過類似的事務之間的場景,但是並沒有做相關係統學習,今天將這四個事務隔離級別詳細的分析一下,以便在後續開發過程中對事務的理解更透徹。

一、READ-UNCOMMITTED(讀未提交)

1、概念

兩個事務,其中一個事務對資料做的DML操作還未提交,另一個事務能夠立即看到。

2、例

老闆給我發工資,先給我打了1W,還沒提交事務,我發現賬上已經有1W了,後面老闆反悔了,說發多了,又更新為5K,我想買個iphone6s,發現錢不夠了。

3、問題

這樣會產生嚴重的髒讀,因為修改的事務也許在提交前還會有其他的很多修改,所以另一個事務的資料讀取會錯亂。

二、READ-COMMITTED(讀已提交)

1、概念

兩個事務,其中一個事務對資料做的DML操作提交後,另一個事務才能看到。

2、例

還用上面的例子,老闆給我打錢,中間反悔了不算,只有在最後確認了,最終發給我5K,那麼我才能夠看到賬戶裡多了5K。

3、問題

避免了上面的問題,但是這樣還是會產生不可重複讀,意思是兩個事務同時開啟,事務A讀取資料後,事務B對資料進行修改後提交,事務A再次讀取,會發現跟前一次讀取的內容不一樣了。

三、REPEATABLE-READ(可重複讀)

1、概念

兩個事務,其中事務A獲取一條資料,事務B在事務A提交事務前無法操作這條資料,這樣就保證了可以重複讀。【資料庫增加了讀鎖】

2、例

A讀取一條資料,給它加鎖,B無法修改這條資料;但是B可以往表中插入、刪除資料。

3、問題

避免了上面的問題,但是這樣還是會產生幻讀現象,意思是兩個事務同時開啟,事務A全表更新未提交事務,事務B做了插入操作提交,事務A在事務中發現全表更新並沒有成功。

四、SERIERLIZED(序列化)

1、概念

兩個事務完全獨立,其中一個事務做的操作,對於另外一個事務不產生任何影響。【資料庫事務加了鎖,所有事務序列執行】

2、問題

避免了上述所有問題,但是效能上影響很大