SQL 標准定義的四個事務隔離級別為:
1.Read Uncommitted ( 未提交讀 )
可以讀取其它事務修改但未提交的數據,但是會導致“臟讀”、“幻讀”和“不可重復讀取”。
2.Read Committed (提交讀)
只能讀取其它事務修改並已經提交的數據。避免了“臟讀取”,但不能避免“幻讀”和“不可重復讀取”。提交讀是大多數主流數據庫的默認事務等級。
3.Repeatable Read (可重復讀)
鎖定已經讀取的數據,當前事務提交前其它事務不允許修改。避免了“臟讀取”和“不可重復讀取”的情況,但不能避免“幻讀”,但是帶來了更多的性能損失。
4.Serializable (可串行化)
讀取前鎖定所有要讀取的數據,當前事務提交前,其它事務不允許修改。最嚴格的級別,事務串行執行,資源消耗最大。
臟讀:所謂的臟讀,其實就是讀到了別的事務回滾前的臟數據。比如事務B執行過程中修改了數據X,在未提交前,事務A讀取了X,而事務B卻回滾了,這樣事務A就形成了臟讀。
不可重復讀:事務A首先讀取了一條數據,然后執行邏輯的時候,事務B將這條數據改變了,然后事務A再次讀取的時候,發現數據不匹配了,就是所謂的不可重復讀了。
幻讀:事務A首先根據條件索引得到N條數據,然后事務B改變了這N條數據之外的M條或者增添了M條符合事務A搜索條件的數據,導致事務A再次搜索發現有N+M條數據了,就產生了幻讀。