
Read Uncommitted:所有事務都可以看到其他未提交事務的執行結果。
會導致【臟讀Drity Read】:讀了錯誤的數據。Read Uncommitted隔離級別時,b事務可以讀取另外a事務未提交的數據,如果a事務rollback,則b事務讀取的數據是錯誤的。
Read Committed:一個事務只能看見已經提交事務所做的改變。
會導致【不可重復讀Non-repeatable read】:兩次讀的某條數據不一致。Read Committed隔離級別時,在一個事務的兩次查詢之間,其他事務提交並更新了該條數據,導致兩次查詢的數據不一致。
Repeatable Read:同一個事務中多次讀取相同的數據返回的結果是一樣的。MySQL的默認事務隔離級別,一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄(讀已經提交的,其實是讀早於本事務開始且已經提交的),但是不能看到其他事務對已有記錄的更新(即晚於本事務開始的),並且,該事務不要求與其他事務是“可串行化”的。
在當前事務提交之前,其它不論什么事務均不能夠改動或刪除當前事務已讀取的數據。並發性低於 READ COMMITTED。由於已讀數據的共享鎖在整個事務期間持有,而不是在每一個語句結束時釋放。
會導致【幻讀Phantom Read】:當用戶讀取某范圍數據行時,另一事務在此范圍內插入新行,當用戶再次讀取此范圍數據行時,讀取到新的幻影行。
Serializable:最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
注意⚠️:不可重復讀重點在於update和delete,而幻讀的重點在於insert。
重點:InnoDB引擎中Repeatable Read的實現原理。
手動測試,mysql里沒有出現幻讀的問題。
spring事務的七種隔離級別如下:
當存在一個事務時,則支持當前事務,如果沒有事務則:1、開啟新事務。2、非事務執行。3、拋出異常。
總是開啟一個新事務
總是非事務執行,如果當前事務存在:1、掛起該事務。2、拋出異常。
PROPAGATION_NESTED 如果活動事務存在,則運行在嵌套事務中,如果沒有活動事務,則安裝PROPAGATION_REQUIRED運行