臟讀:事務A正在訪問數據並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務B也訪問這個數據,然后使用了這個數據。因為這個數據是還沒有提交的數據,那么事務B讀到的這個數據是臟數據,依據臟數據所做的操作可能是不正確的。【事務B讀取到了事務A沒有提交的數據】
不可重復讀:事務A在執行讀取操作,由整個事務A比較大,前后讀取同一條數據需要經歷很長的時間 。在事務A第一次讀取數據后,事務B執行了更改操作,事務A第二次讀取到該值時發現和之前的數據不一樣,系統不可以讀取到重復的數據,稱為不可重復讀。【同一個事務中重復讀取時獲得的數據不同】
幻讀:事務A在執行讀取操作,需要兩次統計數據的總量,前一次查詢數據總量后,此時事務B執行了新增數據的操作並提交后,而后事務A第二次讀取的數據總量和之前統計的不一樣,就像產生了幻覺一樣,平白無故的多了幾條數據,稱為幻讀。【前后多次讀取,數據總量不一致】
不可重復讀的重點在修改,在同一事務中,同樣的條件,第一次讀取的數據和第二次讀取的數據不一樣(因為中間有其他事務提交了修改) 幻讀的重點在刪除和插入,在同一事務中,同樣的條件,第一次讀取的記錄數第二次讀取的記錄數不一致。【因為中間有其他事務提交了插入和刪除操作】
不可重復讀關鍵在於特定的某個數據發生了變化,而幻讀關鍵在於整體的數據量發生了變化。
數據庫中四大隔離級別:read_uncommitted讀未提交,read_committed讀已提交,repeatable_read重復讀,serializable序列化(即串行訪問)
其中:
read_uncommitted級別最低,不能解決臟讀、不可重復讀、幻讀。
read_committed可以解決臟讀,不能解決不可重復讀、幻讀。
repeatable_read可以解決臟讀、不可重復讀,但不能避免幻讀。
serializable隔離級別最高,可以避免臟讀、不可重復讀、幻讀,但是效率低下。
SQL Server和Oracle默認隔離級別為read_committed,而Mysql默認隔離級別為repeatable_read。