資料庫 快速理解髒讀 不可重複讀 幻讀

2022-05-05 04:24:08 字數 1195 閱讀 4111

**於:

髒讀(讀取未提交資料)

a事務讀取b事務尚未提交的資料,此時如果b事務發生錯誤並執行回滾操作,那麼a事務讀取到的資料就是髒資料。就好像原本的資料比較乾淨、純粹,此時由於b事務更改了它,這個資料變得不再純粹。這個時候a事務立即讀取了這個髒資料,但事務b良心發現,又用回滾把資料恢復成原來乾淨、純粹的樣子,而事務a卻什麼都不知道,最終結果就是事務a讀取了此次的髒資料,稱為髒讀。

這種情況常發生於轉賬與取款操作中

時間順序

轉賬事務

取款事務

1開始事務

2開始事務

3查詢賬戶餘額為2000元

4取款1000元,餘額被更改為1000元

5查詢賬戶餘額為1000元(產生髒讀)

6取款操作發生未知錯誤,事務回滾,餘額變更為2000元

7轉入2000元,餘額被更改為3000元(髒讀的1000+2000)

8提交事務

9按照正確邏輯,此時賬戶餘額應該為4000元

不可重複讀(前後多次讀取,資料內容不一致)

事務a在執行讀取操作,由整個事務a比較大,前後讀取同一條資料需要經歷很長的時間 。而在事務a第一次讀取資料,比如此時讀取了小明的年齡為20歲,事務b執行更改操作,將小明的年齡更改為30歲,此時事務a第二次讀取到小明的年齡時,發現其年齡是30歲,和之前的資料不一樣了,也就是資料不重複了,系統不可以讀取到重複的資料,成為不可重複讀。

時間順序

事務a事務b

1開始事務

2第一次查詢,小明的年齡為20歲

3開始事務

4其他操作

5更改小明的年齡為30歲

6提交事務

7第二次查詢,小明的年齡為30歲

備註按照正確邏輯,事務a前後兩次讀取到的資料應該一致

幻讀(前後多次讀取,資料總量不一致)

事務a在執行讀取操作,需要兩次統計資料的總量,前一次查詢資料總量後,此時事務b執行了新增資料的操作並提交後,這個時候事務a讀取的資料總量和之前統計的不一樣,就像產生了幻覺一樣,平白無故的多了幾條資料,成為幻讀。

時間順序

事務a事務b

1開始事務

2第一次查詢,資料總量為100條

3開始事務

4其他操作

5新增100條資料

6提交事務

7第二次查詢,資料總量為200條

備註按照正確邏輯,事務a前後兩次讀取到的資料總量應該一致

資料庫 快速理解髒讀 不可重複讀 幻讀

a事務讀取b事務尚未提交的資料,此時如果b事務發生錯誤並執行回滾操作,那麼a事務讀取到的資料就是髒資料。就好像原本的資料比較乾淨 純粹,此時由於b事務更改了它,這個資料變得不再純粹。這個時候a事務立即讀取了這個髒資料,但事務b良心發現,又用回滾把資料恢復成原來乾淨 純粹的樣子,而事務a卻什麼都不知道...

資料庫 快速理解髒讀 不可重複讀 幻讀

理解這三種由於併發訪問導致的資料讀取問題,再理解事務隔離級別就簡單多了。a事務讀取b事務尚未提交的資料,此時如果b事務發生錯誤並執行回滾操作,那麼a事務讀取到的資料就是髒資料。就好像原本的資料比較乾淨 純粹,此時由於b事務更改了它,這個資料變得不再純粹。這個時候a事務立即讀取了這個髒資料,但事務b良...

資料庫 快速理解髒讀 不可重複讀 幻讀

a事務讀取b事務尚未提交的資料,此時如果b事務發生錯誤並執行回滾操作,那麼a事務讀取到的資料就是髒資料。就好像原本的資料比較乾淨 純粹,此時由於b事務更改了它,這個資料變得不再純粹。這個時候a事務立即讀取了這個髒資料,但事務b良心發現,又用回滾把資料恢復成原來乾淨 純粹的樣子,而事務a卻什麼都不知道...