事務的7種傳播機制和4種隔離級別
事務的傳播機制
支持當前事務:
1、REQUIRED(默認):支持使用當前事務,如果當前事務不存在,創建一個新事務。
2、SUPPORTS:支持使用當前事務,如果當前事務不存在,則不使用事務。
3、MANDATORY:強制,支持使用當前事務,如果當前事務不存在,則拋出Exception。
不支持當前事務:
1、REQUIRES_NEW:創建一個新事務,如果當前事務存在,把當前事務掛起。
2、NOT_SUPPORTED:無事務執行,如果當前事務存在,把當前事務掛起。
3、NESTED:嵌套事務,如果當前事務存在,那麼在嵌套的事務中執行。如果當前事務不存在,則表現跟REQUIRED一樣。
無事務:
1、NEVER:無事務執行,如果當前有事務則拋出Exception。
事務的隔離級別
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
讀未提交(Read-Uncommitted) | 是 | 是 | 是 |
不可重複讀(Read-Committed) | 否 | 是 | 是 |
可重複讀(Repeatable-Read) | 否 | 否 | 是 |
串行化(Serializable) | 否 | 否 | 否 |
事務的併發問題
- 髒讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是髒數據
- 不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果 不一致。
- 幻讀:系統管理員A將數據庫中所有學生的成績從具體分數改爲ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
MySQL InnoDB幻讀處理MVCC:
InnoDB的RR隔離級別沒有或者解決了幻讀問題都不太準確。應該說它並沒有完全解決幻讀的問題。如果在同一個事務裏面,只是總是執行普通的select快照讀,是不會產生幻讀的。但是如果在這個事務裏面通過當前讀或者先更新然後快照讀的形式來讀取數據,就會產生幻讀。