快速了解髒讀、不可重複讀、幻讀?
了解這三種由于并發通路導緻的資料讀取問題,再了解事務隔離級别就簡單多了。
【1】髒讀(讀取未送出資料)
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 | 送出事務 | |
備注 | 按照正确邏輯,此時賬戶餘額應該為4000元 |
【2】不可重複讀(前後多次讀取,資料内容不一緻)
事務A在執行讀取操作,由整個事務A比較大,前後讀取同一條資料需要經曆很長的時間 。而在事務A第一次讀取資料,比如此時讀取了小明的年齡為20歲,事務B執行更改操作,将小明的年齡更改為30歲,此時事務A第二次讀取到小明的年齡時,發現其年齡是30歲,和之前的資料不一樣了,也就是資料不重複了,系統不可以讀取到重複的資料,成為不可重複讀。
時間順序 | 事務A | 事務B |
1 | 開始事務 | |
2 | 第一次查詢,小明的年齡為20歲 | |
3 | 開始事務 | |
4 | 其他操作 | |
5 | 更改小明的年齡為30歲 | |
6 | 送出事務 | |
7 | 第二次查詢,小明的年齡為30歲 | |
備注 | 按照正确邏輯,事務A前後兩次讀取到的資料應該一緻 |
【3】幻讀(前後多次讀取,資料總量不一緻)
事務A在執行讀取操作,需要兩次統計資料的總量,前一次查詢資料總量後,此時事務B執行了新增資料的操作并送出後,這個時候事務A讀取的資料總量和之前統計的不一樣,就像産生了幻覺一樣,平白無故的多了幾條資料,成為幻讀。
時間順序 | 事務A | 事務B |
1 | 開始事務 | |
2 | 第一次查詢,資料總量為100條 | |
3 | 開始事務 | |
4 | 其他操作 | |
5 | 新增100條資料 | |
6 | 送出事務 | |
7 | 第二次查詢,資料總量為200條 | |
備注 |