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 指定的異常類型,不回滾事務。 |
事務不回滾的問題(是否會生效)
- 加於private方法, 無效
- 加於未加入接口的public方法, 再通過普通接口方法調用, 無效
- 加於接口方法,無論下面調用的是private或public方法, 都有效
- 加於接口方法後, 被本類普通接口方法直接調用, 無效
- 加於接口方法後,被本類普通接口方法通過接口調用, 有效
- 加於接口方法後, 被它類的接口方法調用, 有效
- 加於接口方法後, 被它類的私有方法調用後, 有效
- 是否開啓了對註解的解析
- 異常是不是被你catch住了
- 你的異常類型是不是unchecked異常
@Transactional(rollbackFor=Exception.class) 使用rollbackFor的時候是否拋出類異常
- 手動回滾,在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