1.@Transactional聲明式事物也是基于aop實現的,public方法加了@Transactional注解后,已經成功的創建了事務,但是當前方法仍在方法攔截器中
2.業務方法發生異常之后的處理
判斷回滾條件:
?如果自定義了RollbackRuleAttribute列表,如果當前異常匹配到,則回滾(RollbackRuleAttribute默認是RuntimeException),其他異常不會回滾。
滿足回滾條件,那么當前事務執行回滾操作
未滿足回滾操作,那么當前事務可能被回滾,可能被提交。例如當前事務的rollbackOnly為true,依然執行回滾操作。當然如果未能滿足回滾條件的話,即使該事務拋出異常,依然會被提交。
例如:A類的service層的某個方法中調用B類service層的對象方法,B類中方法被A類中的方法調用后,B類方法的事務已經提交,但是spring卻把B類方法的事務標記為rollback-only,A類方法的外層事務管理器再commit時就會拋此異常。(可以設置globalRollbackOnParticipationFailure=false解決,該配置默認是true)。
B.既然聲明式事務也是aop,所以當@Transactional跟其他切面(如@Asyn或其他攔截器MethodIntercepter)同時使用時,需要考慮@Order屬性【切面設置,沒有設置取默認值】,,是按照切面的Order順序來執行的:Order值越小,那么切面越先執行(越后結束).【如果Order相同,則是按照切面字母的順序(自然排序)來執行切面】
假設都使用默認值(@Transactional的Order值是Integer.MAX_VALUE(攔截器不指定時的默認值).@Aysn的值是OrderInteger.MIN_VALUE,如果Order一樣,按照字母順序排序【排序越后的越后執行,越先執行完】,另外SpringAop會先掃描事務攔截器,(自定義攔截器在事務攔截器后面)所以自定義攔截器不會影響事務【事務攔截開始-自定義攔截開始-自定義攔截結束-自定義攔截結束】)
所以不考慮Order的情況下(自定義切面不設置order),自定義aop對本地事務的影響
1.@Before 不會,因為還沒執行到service的業務邏輯
2.@After 報錯會影響事務回滾
3.@AfterReturning 報錯會影響事務回滾
4.@Around? 以Object o=pjp.proceed()為界,之前的代碼不會影響事務回滾,之后的代碼會影響事務回滾.
切面
@PointCut() 連接點
@Before() 前置通知
@Around() 環繞通知
@After() 最終通知
@AfterReturn() 后置通知
@AfterThrow() 異常通知
無異常情況下執行順序為:
環繞通知開始->前置通知->環繞通知.proceed()->環繞通知結束->最終通知->后置通知