spring @Transactional 註解引數概要
1.可配置的引數列表
屬性 | 型別 | 描述 |
---|---|---|
傳播性 |
列舉型:Propagation |
可選的傳播性設定 |
隔離性 |
列舉型:Isolation |
可選的隔離性級別(預設值:ISOLATION_DEFAULT ) |
只讀性 |
布林型 | 讀寫型事務 , 只讀型事務 |
超時 |
int型(秒) | 事務超時 |
回滾異常類(rollbackFor) |
一組 Class 類的例項,必須是Throwable 的子類 |
一組異常類,遇到時 必須 進行回滾。預設情況下checked exceptions不進行回滾,僅unchecked exceptions(即RuntimeException |
回滾異常類名(rollbackForClassname) |
一組 Class 類的名字,必須是Throwable 的子類 |
一組異常類名,丟擲時回滾 |
不回滾異常類(noRollbackFor) |
一組 Class 類的例項,必須是Throwable 的子類 |
一組異常類,丟擲時回滾。 |
不回滾異常類名(noRollbackForClassname) |
一組 Class 類的名字,必須是Throwable 的子類 |
一組異常類,丟擲時回滾 |
2.傳播性 Propagation
2.1 @Transactional(propagation = Propagation.PROPAGATION_REQUIRED
預設的傳播屬性,如果當前沒有事務,就建立一個新事務,如果當前存在事務,就加入該事務,該設定是最常用的設定。
注意:這種傳播屬性在巢狀事務時,整個sevice層的上下文使用的是同一個事務,只要最後沒有丟擲異常,則整個事務提交,不會回滾。
2.2 @Transactional(propagation = Propagation.PROPAGATION_SUPPORTS)
支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。
2.3 @Transactional(propagation = Propagation.PROPAGATION_MANDATORY
支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就丟擲異常。
注意:可設定在mapper層,強迫service層新增事務
2.4 @Transactional(propagation = Propagation.PROPAGATION_REQUIRES_NEW)
建立新事務,無論當前存不存在事務,都建立新事務。當巢狀使用時,原事務擱置,新事務啟用,新事務完成時自動提交,原事務繼續執行。
注意:新事務與其他事務無關,獨立提交。並且,該事務傳播性在巢狀時不能與呼叫者的事務在一個類中。
2.5 @Transactional(propagation = Propagation.PROPAGATION_NOT_SUPPORTED)
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
注意:PROPAGATION_SUPPORTS與 PROPAGATION_NOT_SUPPORTED的區別。
2.6 @Transactional(propagation = Propagation.PROPAGATION_NEVER)
以非事務方式執行,如果當前存在事務,則丟擲異常。
注意:PROPAGATION_MANDATORY 與 PROPAGATION_NEVER的區別。
2.7 @Transactional(propagation = Propagation.PROPAGATION_NESTED)
巢狀級別事務。如果上下文中存在事務,則巢狀事務執行,如果不存在事務,則新建事務。即:在事務中呼叫該事務註解的方法時,原事務擱置,新啟一個事務執行,當新事務執行完成時不會提交,原事務繼續執行,新事物隨原事務一起提交。
注意:新事務與其他事務無關,但是隨呼叫者的事務提交。並且,該事務傳播性在巢狀時不能與呼叫者的事務在一個類中。 PROPAGATION_NESTED與 PROPAGATION_REQUIRES_NEW的區別。
3 隔離性 Isolation
名詞解釋:
髒讀(修改資料):事務A修改資料後,並未提交,事務B讀取了事務A修改過的資料,事務A回滾,導致事務B處理了不該處理的資料。
不可重複讀(修改資料):事務A讀取資料後,事務B修改資料並提交,事務A再次讀取到的資料與之前讀到的資料不一致。
幻像讀(增刪資料):事務A讀取資料後,事務B增刪資料並提交,導致事務A讀到了不一樣的結果集。
3.1 @Transactional(isolation = Isolation.DEFAULT)
預設的隔離級別,使用資料庫預設的事務隔離級別。
3.2 @Transactional(isolation = Isolation.READ_COMMITTED)
保證一個事務修改的資料提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的資料。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。
3.3 @Transactional(isolation = Isolation.READ_UNCOMMITTED)
最低隔離級別,它充許別外一個事務可以看到這個事務未提交的資料。這種隔離級別會產生髒讀,不可重複讀和幻像讀。慎用!
3.4 @Transactional(isolation = Isolation.REPEATABLE_READ)
這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。
原因是事務A讀取到資料以後,在A提交前,事務B修改了資料,並提交。此時,A再在讀到的資料並不是最新的,待A提交資料後,會引起資料錯誤。
3.5 @Transactional(isolation = Isolation.SERIALIZABLE)
效能最差(鎖表),可靠性最高的事務隔離級別。事務被處理為順序執行。除了防止髒讀,不可重複讀外,還避免了幻讀。