不同的隔離級別:
01 Read Uncommitted 讀取未提交內容
- 最低的隔離級別,什麼都不需要做,一個事務可以讀到另一個事務未提交的結果。
- 所有的併發事務問題都會發生。
- 讀取未提交的數據,也被稱之爲髒讀(Dirty Read)。
02 Read Committed 讀取提交內容
- 只有在事務提交後,其更新結果纔會被其他事務看見。
- 可以解決髒讀問題。
03 Repeated Read 可重複讀
- 在一個事務中,對於同一份數據的讀取結果總是相同的,無論是否有其他事務對這份數據進行操作,以及這個事務是否提交。
- 可以解決髒讀、不可重複讀。
04 Serialization 可串行化
- 事務串行化執行,隔離級別最高,犧牲了系統的併發性。
- 可以解決併發事務的所有問題。
事務併發安全問題
一、髒讀
- 髒讀指的就是髒數據,一個事務並未提交的數據便是髒數據。
二、不可重複讀
- 一個事務在執行期間無論重複讀取多少次數據,返回的結果都應該與第一次讀取到的數據一致,如果不一致,那便意味着發生了不可重複讀的安全問題。
- 同時操作,事務一分別讀取事務二操作時和提交後的數據,讀取的記錄內容不一致。
例子:
- 事務T1讀取某一數據,事務T2讀取並修改了該數據,T1爲了對讀取值進行檢驗而再次讀取該數據,便得到了不同的結果。
三、幻讀
-
幻讀側重的是整行的數據變化,如果一個事務在執行期間讀取到的結果數量不相同,那就說明讀取到了幻影數據,發生了幻讀問題。
-
和可重複讀類似,但是事務二的數據操作僅僅是插入和刪除,不是修改數據,讀取的記錄數量前後不一致。
例子:
- 在事務1中,查詢User表id爲1的是用戶否存在,如果不存在則插入一條id爲1的數據。
- 在事務1查詢結束後,事務2往User表中插入了一條id爲1的數據。
- 此時,由於事務1查詢到id爲1的用戶不存在,因此插入1條id爲1的數據。
- 但是由於事務2已經插入了1條id爲1的數據,因此此時會報主鍵衝突,對於事務1 的業務來說是執行失敗的,這裏事務1 就是發生了幻讀。