1. 程式人生 > >spring @Transactional 註解引數概要

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)

      效能最差(鎖表),可靠性最高的事務隔離級別。事務被處理為順序執行。除了防止髒讀,不可重複讀外,還避免了幻讀。