實際上也是問的這個問題 spring的事務管理是如何實作的?
總:
spring的事務是由aop來實作的,首先要生成具體的代理物件,然后按照aop的整套流程來執行具體的操作邏輯,正常情況下要
通過通知來完成核心功能,但是事務不是通過通知來實作的,而是通過一個TransactionInterceptor來實作的,然后呼叫invoke來實作具
體的邏輯
分:
1、先做準備作業,決議各個方法上事務相關的屬性,根據具體的屬性來判斷是否開始新事務
2、當需要開啟的時候,獲取資料庫連接,關閉自動提交功能,開起事務
3、執行具體的sqI邏輯操作
4、在操作程序中,如果執行失敗了,那么會通過completeTransactionAfterThrowing看來完成事務的回滾操作,回滾的具體邏
輯是通過doRollBack方法來實作的,實作的時候也是要先獲取連接物件,通過連接物件來回滾
5、如果執行程序中,沒有任何意外情況的發生,那么通過commitTransactionAfterReturning來完成事務的提交操作,提交的
具體邏輯是通過doCommit方法來實作的,實作的時候也是要獲取連接,通過連接物件來提交
6、當事務執行完畢之后需要清除相關的事務資訊cleanupTransactionInfo
spring傳播特性有7種
某一個事務嵌套另一個事務的時候怎么辦?
A方法呼叫B方法,AB方法都有事務,并且傳播特性不同,那么A如果有例外,B怎么辦,B如果有例外,A怎么辦?
總:
事務的傳播特性指的是不同方法的嵌套呼叫程序中,事務應該如何進行處理,是用同一個事務還是不同的事務,當出現例外的
時候會回滾還是提交,兩個方法之間的相關影響,在日常作業中,使用比較多的是required,Requires_new,nested
分:
1、先說事務的不同分類,可以分為三類:支持當前事務,不支持當前事務,嵌套事務
2、如果外層方法是required,內層方法是,required,requires_new,nested
3、如果外層方法是requires_new,內層方法是,required,requires_new,nested
4、如果外層方法是nested,內層方法是,required,requires_new,nested
核心處理邏輯非常簡單:
1、判斷內外方法是否是同一個事務:
是:例外統一在外層方法處理
不是:內層方法有可能影響到外層方法,但是外層方法是不會影響內層方法的
(大致可以這么理解,但是有個別情況不同,neste)
1、REQUIRED和NESTED回滾的區別
在回答兩種方式區別的時候,最大的問題在于保存點的設定,很多同學會認為內部設定REQURED和NESTED效果是一樣的,其實在外層方法對內層方法的例外情況在進行捕獲的時候區另
都不同,使用RECSJIRED的時候,會報Transaction rolled back because it has been marked as rollback-only資訊,因為內部例外了,設定了回滾標記,外部捕獲之后,要進行事務的提交,
意味著要回滾,所以會報例外,而NESTED不會發證這種情況,因為在回滾的時候把回滾標記清除了,外部捕獲例外后去提交,沒發現回滾標記,就可以正常提交了,
2、REQUIRED_NEW和REQUIRED區別
這兩種方式產生的效果是一樣的,但是REQUIRED_NEW會有新的連接生成,而NESTED使用的是當前事務的連接,而且NESTED還可以回滾到保存點,REQUIRED_NEW每次都是一個新的事
務的回滾,但NESTED其實是一個事務,外層事務可以控制內層事務的回滾,內層就算沒有例外,外層出現例外,也可以全部回滾,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418999.html
標籤:Java
上一篇:里氏替換原則
下一篇:返回列表