Transactional註解事務

1.事務開啓

聲明式事務有兩種方式,一種是在配置文件(xml)中做相關的事務規則聲明,另一種是基於@Transactional 註解的方式

啓動類上需要加上事務開啓註解

@EnableTransactionManagement

2.特性

1、service類標籤(一般不建議在接口上)上添加@Transactional,可以將整個類納入spring事務管理,在每個業務方法執行時都會開啓一個事務,不過這些事務採用相同的管理方式。

2、@Transactional 註解只能應用到 public 可見度的方法上。 如果應用在protected、private或者 package可見度的方法上,也不會報錯,不過事務設置不會起作用。

3、默認情況下,Spring會對unchecked異常進行事務回滾;如果是checked異常則不回滾。

java裏面將派生於Error或者RuntimeException(比如空指針,1/0)的異常稱爲unchecked異常,其他繼承自java.lang.Exception得異常統稱爲Checked Exception,如IOException、TimeoutException等

4、只讀事務:
@Transactional(readOnly=true)
只讀標誌只在事務啓動時應用,否則即使配置也會被忽略。
啓動事務會增加線程開銷,數據庫因共享讀取而鎖定(具體跟數據庫類型和事務隔離級別有關)。通常情況下,僅是讀取數據時,不必設置只讀事務而增加額外的系統開銷。

屬性名 說明
name 當在配置文件中有多個 TransactionManager , 可以用該屬性指定選擇哪個事務管理器。
propagation 事務的傳播行爲,默認值爲 REQUIRED、NOT_SUPPORTED、REQUIRESNEW、MANDATORY、SUPPORTS、NEVER、NESTED
isolation 事務的隔離度,默認值採用 DEFAULT。
timeout 事務的超時時間,默認值爲-1。如果超過該時間限制但事務還沒有完成,則自動回滾事務。
read-only 指定事務是否爲只讀事務,默認值爲 false;爲了忽略那些不需要事務的方法,比如讀取數據,可以設置 read-only 爲 true。
rollback-for 用於指定能夠觸發事務回滾的異常類型,如果有多個異常類型需要指定,各類型之間可以通過逗號分隔。
no-rollback- for 拋出 no-rollback-for 指定的異常類型,不回滾事務。

事務不回滾的問題(是否會生效)

  1. 加於private方法, 無效
  2. 加於未加入接口的public方法, 再通過普通接口方法調用, 無效
  3. 加於接口方法,無論下面調用的是private或public方法, 都有效
  4. 加於接口方法後, 被本類普通接口方法直接調用, 無效
  5. 加於接口方法後,被本類普通接口方法通過接口調用, 有效
  6. 加於接口方法後, 被它類的接口方法調用, 有效
  7. 加於接口方法後, 被它類的私有方法調用後, 有效
  8. 是否開啓了對註解的解析
  9. 異常是不是被你catch住了
  10. 你的異常類型是不是unchecked異常
  11. @Transactional(rollbackFor=Exception.class) 使用rollbackFor的時候是否拋出類異常
  12. 手動回滾,在catch中添加回滾代碼TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

https://blog.csdn.net/u011410529/article/details/54287307
https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html
https://segmentfault.com/a/1190000014617571

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章