Spring支援的常用資料庫事務傳播屬性和事務隔離級別?
事務傳播屬性
事務的傳播行為:一個方法執行在了一個開啟了事務的方法中時,當前方法是使用原來的事務還是開啟一個新的事務
事務的傳播行為可以由傳播屬性指定。Spring定義了7種類傳播行為。
傳播屬性 | 描述 |
REQUIRED(常用) |
如果有事務在執行,當前的方法就在這個事務內執行,否則,就啟動一個新的事務,並在自己的事務內執行 |
REQUIRED_NEW(常用) |
當前的方法必須啟動新事務,並在它自己的事務內執行.如果有事務正在執行,應該將它掛起 |
SUPPORTS |
如果有事務在執行,當前的方法就在這個事務內執行.否則它可以不執行在事務中 |
NOT_SUPPORTED |
當前的方法不應該執行在事務中.如果有執行的事務,將它掛起 |
MANDATORY |
當前的方法必須執行在事務內部,如果沒有正在執行的事務,就丟擲異常 |
NEVER |
當前的方法不應該執行在事務中.如果有執行的事務,就丟擲異常 |
NESTED |
如果有事務在執行,當前的方法就應該在這個事務的巢狀事務內執行.否則,就啟動一-個新的事務,並在它自己的事務內執行 |
事務傳播屬性可以在@Transactional註解的propagation屬性中定義。
事務隔離級別
資料庫事務併發問題
假設現在有兩個事務:Transaction01和 Transaction02併發執行。
1、髒讀
①Transaction01將某條記錄的AGE值從20修改為30。
②Transaction02讀取了Transaction01更新後的值:30。
③Transaction01回滾,AGE值恢復到了20。
④Transaction02讀取到的30就是一個無效的值。
2、不可重複讀
①Transaction01讀取了AGE值為20。
②Transaction02將AGE值修改為30。
③Transaction01再次讀取AGE值為30,和第一次讀取不一致。
3、幻讀
①Transaction01讀取了STUDENT表中的一部分資料。
②Transaction02向STUDENT表中插入了新的行。
③Transaction01讀取STUDENT表時,多出了一些行。
隔離級別
資料庫系統必須具有隔離併發執行各個事務的能力,使它們不會相互影響,避免各種併發問題。一個事務與其他事務隔離的程度稱為隔離級別。SQL標準中規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度﹐隔離級別越高,資料一致性就越好,但併發性越弱。
①讀未提交:READ UNCOMMITTED
允許Transaction01讀取Transaction02未提交的修改。
②讀已提交:READ COMMITTEDJ(開發時通常使用的隔離級別)
要求Transaction01只能讀取Transaction02己提交的修改。
③可重複讀:REPEATABLE READ
確保Transaction01可以多次從一個欄位中讀取到相同的值,即 Transaction01執行期間禁止其它事務對這個欄位進行更新。
④序列化:SERIALIZABLE
確保Transaction01可以多次從一個表中讀取到相同的行,在Transaction01執行期間,禁止其它事務對這個表進行新增、更新、刪除操作。可以避免任何併發問題,但效能十分低下。
解決能力
髒讀 | 不可重複讀 | 幻讀 | |
READ UNCOMMITTED |
有 | 有 | 有 |
READ COMMITTED |
無 | 有 | 有 |
REPEATABLE READ |
無 | 無 | 有 |
SERIALIZABLE |
無 | 無 | 無 |
支援程度
Oralce | MySQL | |
READ UNCOMMITTED | ✗ | ✓ |
READ COMMITTED | ✓(預設) | ✓ |
REPEATABLE READ | ✗ | ✓(預設) |
SERIALIZABLE | ✓ | ✓ |