
springcloud之seata在微服务模块全局异常捕捉后导致事务不滚优雅
作者 | IT学习道场
来源 | IT学习道场(ID:itlearndojo)
seata几个核心角色如下:事务协调者(TC) :管理全局的分支事务的状态,用于全局性事务的提交和
回 滚。
事务管理者(TM) :用于开启、提交或回滚事务。
资源管理器(RM) :用于分支事务上的资源管理,向 TC 注册分支事务,上报
分支事务的状态,接收 TC 的命令来提交或者回滚分支事务
异常捕获了,就相当你把事务try/catch了,seata的原理是入全局事务入口
(加了 @GlobalTransactional )方法,TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID,XID 在微服务调用链路的上下文中传播,在各自的微服务中RM会判断请求中是否有XID,有就开启一个分支事务
根据分支事务的情况,TM 向 TC 发起针对 XID 的全局提交或回滚决议,
TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
下面分析事务捕获,也就是说,分支事务没异常,则事务提交,不会回滚。
微服务中全局异常,会使得分支事务httpResponse中的status状态 = 200,TM就是认为事务是正常的,执行提交哦,
这里解决方案就是在全局异常处理中,判断下是否开启了seata的全局事务,如果开启,则设置httpResponse中的status状态 = 500,这样TM就是认为事务是异常了,抛出TmTransactionException异常,事务就可以回滚了
解决方案代码
这个是全局异常在一个方法中进行处理的
下面是大家习惯了的异常处理习惯,代码如下,原理都一样
AjaxVo 是我们系统的全局响应统一数据结构
你get了吗?
