三種讀法的產生緣由:都是因爲併發訪問致使數據發生了變化數據庫
事務A正在訪問數據,而且對數據進行了修改,而這種修改尚未提交到數據庫中;此時事務B也訪問這個數據,而且使用了這個數據。併發
事務A在執行讀取操做,因爲事務A比較大,先後讀取完同一條數據可能須要經歷很長的時間。當事務A讀取完一條數據;隨後事件B執行了更改操做,將以前的數據進行了修改;當事務A第二次讀取這串數據,發現這次讀取的數據內容跟以前不一樣了,也就是數據不重複了。spa
事務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先後兩次取到的數據應該一致 |
注意:事務
不可重複讀的重點是修改:一樣的條件,你讀取過的數據,再次讀取出來發現值不同了。table
幻讀的重點在於新增或者刪除:一樣的條件,第 1 次和第 2 次讀出來的記錄數不同。統計