事務隔離級別和Spirng事務傳播級別
阿新 • • 發佈:2019-12-31
事務的四個特性(ACID)
原子性
一個事務(transaction)中的所有操作,或者全部完成,或者全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。即,事務不可分割、不可約簡。
隔離性
資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀已提交(read committed)、可重複讀(repeatable read)和序列化/序列化(Serializable)。
一致性
在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設約束、觸發器、級聯回滾等。
永續性
事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。
事務的隔離級別
讀未提交:read uncommited
- 產生的問題:髒讀、幻讀、不可重複讀
- 解決的問題:null
讀已提交:read commited
- 產生的問題:幻讀、不可重複讀
- 解決的問題:髒讀
可重複讀:repeatable read
- 產生的問題:幻讀
- 解決的問題:髒讀、不可重複讀
序列化(序列化):serializable
- 產生的問題:null
- 解決的問題:All
- 隔離級別最高,效率最低
髒讀、幻讀、不可重複讀
1. 髒讀
一個事務讀到了另一個事務未提交的資料(回滾)
2. 幻讀
是不可重複讀的一種特殊場景:當事務1兩次執行SELECT ... WHERE檢索一定範圍內資料的操作中間,事務2在這個表中建立了(如INSERT)了一行新資料,這條新資料正好滿足事務1的“WHERE”子句。
給人的感覺就像出現了幻覺一樣,之前明明不存在的資料,現在突然出現了,被稱為“幻讀”。
3. 不可重複讀
第一個事務兩次“讀取”過程中,另一個事務對同樣的資料進行更新,第一個事務兩次讀取結果不一致,所以被稱為“不可重複讀”。
資料庫預設隔離級別
- mysql:repeatable read(可重複讀
- Oracle:read commited(讀已提交)
事務的傳播級別
- MANDATORY:(mandatory:強制性) 可以使用當前的事務,如果沒有事務,丟擲異常
- REQUERS_NEW:(requers_new)新建一個事務,如果存在事務,則掛起之前的事務
- REQUIRED:(required)(增刪改)如果沒有事務,則新建一個事務;如果有事務,加入這個事務當中
- NESTED:(nested:巢狀)有事務,巢狀執行,沒有事務,執行required
- SUPPORTS:(supports)如果沒有事務,非事務執行,如果有事務,加入這個事務當中
- NOT_SUPPORTED:(not_supported)必須非事務執行,如果有事務,則掛起事務
- NEVER:(never)非事務執行,如果存在事務,丟擲異常
PS:
- 文章來自各種資源的整理(部分原創),如有侵權請告知刪除。
- 轉載本文請註明出處