一、事務的傳播行為
PROPAGION_XXX :事務的傳播行為
保證同一個事務中
- PROPAGATION_REQUIRED 支持當前事務,如果不存在 就新建一個(默認)
- PROPAGATION_SUPPORTS 支持當前事務,如果不存在,就不使用事務
- PROPAGATION_MANDATORY 支持當前事務,如果不存在,拋出異常
保證沒有在同一個事務中
- PROPAGATION_REQUIRES_NEW 如果有事務存在,掛起當前事務,創建一個新的事務
- PROPAGATION_NOT_SUPPORTED 以非事務方式運行,如果有事務存在,掛起當前事務
- PROPAGATION_NEVER 以非事務方式運行,如果有事務存在,拋出異常
- PROPAGATION_NESTED 如果當前事務存在,則嵌套事務執行
二、@Transactional 注解失效場景(注意事項)
1、@Transactional 注解應用在非 public 修飾的方法上,導致注解失效
2、propagation 設置錯誤,導致注解失敗
如PROPAGATION_NEVER、PROPAGATION_NOT_SUPPORTED會使當前事務無法使用,PROPAGATION_SUPPORTS不會新建事務
3、rollbackFor 設置錯誤,@Transactional 注解失敗
在 spring 項目中, @Transactional 注解默認會回滾運行時異常及其子類,其它范圍之外的異常 Spring 不會幫我們去回滾數據(如果也想要回滾,在方法或者類加上@Transactional(rollbackFor = Exception.class) 即可。
4、方法之間的互相調用導致 @Transactional 失效
(1)非事務方法調用事務方法時,事務方法的事務不會生效;
(2)同一個類里methodA調用methodB時,methodB如果隔離級別Propagation.REQUIRES_NEW,希望創建一個新事務,這時methodB的事務注解不會生效,因為沒有經代理,此時methodA和B會一起處在A的事務下,代理見四
5、異常被 catch 捕獲導致 @Transactional 注解失效
6、數據庫引擎不支持事務
首先,mysql支持
三、事務的四大特性
- 原子性
- 一致性
- 隔離性(重要!務必好好理解!)
a.并發的事務相互獨立。事務中對數據的操作彼此不可互見,除非數據已經提交后更新到庫里。
b.同一事務里的操作彼此可見。如果同一事務里先插入3條數據在查詢,這3條數據是可以被查到的,如果是最后統一執行數據庫操作,先查后插入則查不到。
- 持久性
四、獲取類的代理對象
(1)注入applicationContext,再通過applicationContext.getBean獲取代理對象。
(2)AopContext.currentProxy()獲取當前類的代理類對象,局限于獲取當前類。
參考:【Java 基礎】SpringBoot 中 @Transactional 注解的使用與實踐
Spring 事務方法與非事務方法相互調用 @Transactional 注解失效分析
浙公網安備 33010602011771號