事務傳播機制 與 隔離級別
(一)事務傳播機制 7種
Required (預設):
如果當前沒有事務,就新建一個事務,如果已存在一個事務中
加入到這個事務中,這是最常見的選擇。
Supports :
支援當前事務,如果沒有當前事務,就以非事務方法執行。
Mandatory :
中文翻譯為強制,支援使用當前事務,如果當前事務不存在,則丟擲Exception。
Requies_new :
建立一個新事務,如果當前事務存在,把當前事務掛起。
Not_Supported :
無事務執行,如果當前事務存在,把當前事務掛起。
Never :
無事務執行,如果當前有事務則丟擲Exception。
Nested :
巢狀事務,如果當前事務存在,那麼在巢狀的事務中執行。
如果當前事務不存在,則表現跟REQUIRED一樣。
註解配置時如:@Transactional(propagation=Propagation.REQUIRED)
7種事務舉例子可看此篇部落格 感覺不錯:https://www.cnblogs.com/myseries/p/10800430.html
(二)事務隔離級別
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
讀未提交(Read-Uncommitted) |
是 | 是 | 是 |
不可重複讀(Read-Committed) | 否 | 是 | 是 |
可重複讀(Repeatable-Read) | 否 | 否 | 是 |
序列化(Serializable) | 否 | 否 | 否 |
註解配置時如:@Transactional(isolation = Isolation.READ_UNCOMMITTED)
Mysql 預設 可重複讀 ---repeatable-read
事務的併發問題
1、髒讀:事務A讀取了事務B更新的資料,然後B回滾操作,那麼A讀取到的資料是髒資料
2、不可重複讀:事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的過程中,
對資料作了更新並提交,導致事務A多次讀取同一資料時,結果 不一致。
3、幻讀:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,
但是系統管理員B就在這個時候插入了一條具體分數的記錄,
當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。
解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
回村