前言
事務對於 java web 應用來講,也是比較大的一方面。面試的時候也會常常的問到,包含的內容有:java
- 事務的四大特性
- 事務的隔離級別
- spring 事務的傳播機制
預期讀者
對事務有必定基礎的同窗,想弄清楚 spring 事務的傳播機制git
爲何會有傳播機制
spring 對事務的控制,是使用 aop 切面實現的,咱們不用關心事務的開始,提交 ,回滾,只須要在方法上加 @Transactional
註解,這時候就有問題了。web
- 場景一: serviceA 方法調用了 serviceB 方法,但兩個方法都有事務,這個時候若是 serviceB 方法異常,是讓 serviceB 方法提交,仍是兩個一塊兒回滾。
- 場景二:serviceA 方法調用了 serviceB 方法,可是隻有 serviceA 方法加了事務,是否把 serviceB 也加入 serviceA 的事務,若是 serviceB 異常,是否回滾 serviceA 。
- 場景三:serviceA 方法調用了 serviceB 方法,二者都有事務,serviceB 已經正常執行完,但 serviceA 異常,是否須要回滾 serviceB 的數據。
傳播機制生效條件
由於 spring 是使用 aop 來代理事務控制 ,是針對於接口或類的,因此在同一個 service 類中兩個方法的調用,傳播機制是不生效的面試
傳播機制類型
下面的類型都是針對於被調用方法來講的,理解起來要想象成兩個 service 方法的調用才能夠。spring
PROPAGATION_REQUIRED (默認)
- 支持當前事務,若是當前沒有事務,則新建事務
- 若是當前存在事務,則加入當前事務,合併成一個事務
REQUIRES_NEW
- 新建事務,若是當前存在事務,則把當前事務掛起
- 這個方法會獨立提交事務,不受調用者的事務影響,父級異常,它也是正常提交
NESTED
- 若是當前存在事務,它將會成爲父級事務的一個子事務,方法結束後並無提交,只有等父事務結束才提交
- 若是當前沒有事務,則新建事務
- 若是它異常,父級能夠捕獲它的異常而不進行回滾,正常提交
- 但若是父級異常,它必然回滾,這就是和
REQUIRES_NEW
的區別
SUPPORTS
- 若是當前存在事務,則加入事務
- 若是當前不存在事務,則以非事務方式運行,這個和不寫沒區別
NOT_SUPPORTED
- 以非事務方式運行
- 若是當前存在事務,則把當前事務掛起
MANDATORY
- 若是當前存在事務,則運行在當前事務中
- 若是當前無事務,則拋出異常,也即父級方法必須有事務
NEVER
- 以非事務方式運行,若是當前存在事務,則拋出異常,即父級方法必須無事務
一點小說明
通常用得比較多的是 PROPAGATION_REQUIRED
, REQUIRES_NEW
;數據庫
REQUIRES_NEW
通常用在子方法須要單獨事務,暫時找不到例子,之後補充 。mybatis
完整的演示程序
https://gitee.com/sanri/example/tree/master/test-mybatis工具
一點小推廣
Excel 通用導入導出,支持 Excel 公式
https://blog.csdn.net/sanri1993/article/details/100601578.net
使用模板代碼 ,從數據庫生成代碼 ,及一些項目中常常能夠用到的小工具
https://blog.csdn.net/sanri1993/article/details/98664034代理