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