配置了全域性異常處理,如何保證分布式事務正常執行

2021-10-14 04:14:27 字數 1066 閱讀 4065

相關背景:

微服務場景下,配置了統一全域性異常處理,導致seata在at模式下無法正常回滾問題

spring boot版本 2.2.2 cloud 版本 hoxton.release

seata版本1.4

假設服務a呼叫服務b, 服務b發生異常,由於全域性異常處理的存在(@controlleradvice), seata 無法攔截到b服務的異常,從而導致分布式事務未生效

利用aop攔截@globaltransactional 檢查是否發生異常,如有異常,則回滾事務

上**

/**

* seata at模式下事務異常回滾操作, 僅需在全域性事務發起端配置此handle

*/@slf4j

@aspect

@component

public

class

attransactionalhandler

@afterthrowing

(throwing =

"throwable"

, pointcut =

"txannotation()"

)public

void

doafterreturning

(throwable throwable)

log.

info

("aop

----

--- 全域性事務回滾--

---xid:

----

--》", globaltransaction.

getxid()

);trycatch

(transactionexception e)

}}

由於aop只能處理主事務端異常,而無法處理從事務端異常,而且我們配置了全域性異常處理,所以rpc一定會有返回值

所以在每個全域性事務方法最後, 需要判斷rpc是否發生異常

發生異常則丟擲runtimeexception, 配置的aop攔截則會回滾事務

分布式全域性異常處理

1 定義異常類 public class bizexception extends runtimeexception public bizexception int errorcode,string errormsg public bizexception string errormsg publi...

SpringMvc全域性異常處理器配置

在程式開發中,我們的程式無法避免的會碰到各種異常情況,配置全域性異常處理可以方便開發人員編寫和管理異常處理的 第一步 自定義異常類如customexception類繼承exception類 public class customexception extends exception public s...

如何建立真正的STRUTS2 全域性異常配置

近期看了下struts2.0 發現可以對異常以配置的方式進行特定的處理,這可是非常實用的功能,於是乎拉出來練練。原來一些書籍中描述的全域性配置只是針對某給包內的全域性配置,如下 error.jsp orgorg addorg.jsp 那該所謂的全域性異常只是針對該包內的配置起作用,那如何配置真正的全...