## Spring事務注解
#### @Transactional注解參數說明
```
事務傳播行為種類
Spring在TransactionDefinition接口中規定了7種類型的事務傳播行為
它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播。
使用示例:
@Transactional(propagation=Propagation.REQUIRED)
```
事務傳播行為類型 | 說明
---|---
PROPAGATION_REQUIRED | 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS | 支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY | 使用當前的事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW | 新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED | 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER | 以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED | 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類 似的操作。
#### @Transational 注解失效原因排查
```
1、@Transactional 加于private方法,無效
2、@Transactional 加于未加入接口的public方法, 3、再通過普通接口方法調用,無效
4、@Transactional 加于接口方法,無論下面調用的是private或public方法,都有效
5、@Transactional 加于接口方法后,被本類普通接口方法直接調用,無效
6、@Transactional 加于接口方法后,被本類普通接口方法通過接口調用,有效
7、@Transactional 加于接口方法后,被它類的接口方法調用,有效
8、@Transactional 加于接口方法后,被它類的私有方法調用后,有效
```
原因:
```
@Transactional 失效的背后其實就是 Spring 代理機制造成的。說白了,就是通過 Spring 容器獲取的類對象,很多情況下并不是原類,而是被 Spring 修飾過了的代理類。然后,你在被代理的方法中調用當前類的其它方法,此時就是調用的原生類中的方法。
聽不懂沒關系,我下面用偽代碼給你演示一下,你就知道了。
假如現在要執行 Xttblog 類對象的方法 invoke(),而用 Spring 代理后,會對 Xttblog 類做修飾,也就是會對 Xttblog 的 test 方法生成一個代理類。
執行,調用代理方法 proxyXttblogbean.invoke():
before 操作
invoke(bean,Xttblog)
after 操作
實際你運行的是 Spring 修飾過的代理類 proxyXttblogbean.invoke()方法。
這樣就會造成一個問題,如果你在 invoke() 中調用 Xttblog 類的其余方法 invoke2(),此時 invoke2() 是直接調用的原類的 Xttblog.invoke2(),而不是代理類 proxyXttblogbean.invoke2()。這時 Xttblog.invoke2() 上的一些注解全部都沒有被增強修飾。所以,最終的結果就和你的預期不一致了。
```
- JDK常用知識庫
- JDK各個版本安裝
- Java8流
- 算法
- 十大排序算法
- 冒泡排序
- 選擇排序
- 插入排序
- 歸并排序
- 快速排序
- 堆排序
- 希爾排序
- 計數排序
- 桶排序
- 基數排序
- 總結
- 常用工具類
- 浮點型計算
- 時間格式處理
- 常用功能點思路整理
- 登錄
- 高并發
- 線程安全的單例模式
- Tomcat優化
- Tomcat之APR模式
- Tomcat啟動過慢問題
- 常用的數據庫連接池
- Druid連接池
- 緩存
- Redis
- SpringBoot整合Redis
- 依賴和配置
- RedisTemplate工具類
- 工具類使用方法
- Redis知識庫
- Redis安裝
- Redis配置參數
- Redis常用Lua腳本
- MongoDB
- SpringBoot操作MongoDB
- 依賴和配置
- MongoDB工具類
- 工具類使用方法
- 消息中間件
- ActiveMq
- SpringBoot整合ActiveMq
- 框架
- SpringBoot
- 定時任務
- 啟動加載
- 事務
- JSP
- 靜態類注入
- SpringSecurity
- Shiro
- 配置及整合
- 登陸驗證
- 權限驗證
- 分布式應用
- SpringMVC
- ORM框架
- Mybatis
- 增
- 刪
- 改
- 查
- 程序員小笑話
- 我給你講一個TCP的笑話吧
- 二進制笑話
- JavaScript的那點東西
- JavaScript內置對象及常見API詳細介紹
- JavaScript實現Ajax 資源請求
- JavaScript干貨
- 架構師成長之路
- JDK源碼解析
- ArrayList源碼解讀
- 設計模式
- 微服務架構設計模式
- 逃離單體煉獄
- 服務的拆分策略
- 全面解析SpringMvc框架
- 架構設計的六大原則
- 并發集合
- JUC并發編程
- 搜索引擎
- Solr
- Solr的安裝
- 分布式服務框架
- Dubbo
- 從零開始學HTMl
- 第一章-初識HTML
- 第二章-認識HTML標簽