seata代码控制回滚和临时挂起分布式事物

网友投稿 322 2022-09-26

seata代码控制回滚和临时挂起分布式事物

seata代码控制回滚和临时挂起分布式事物

​​一、说明​​​​二、功能实现​​

​​1、手动回滚分布式事物​​​​2、临时挂起分布式事物​​

​​三、完整代码​​​​四 参考链接​​

一、说明

此处只是简单的记录一下,使用了 ​​Seata​​后,如何手动 回滚分布式事物和临时挂起分布式事务,Seata的整合不做详细的说明。

二、功能实现

1、手动回滚分布式事物

举例:

比如我们通过feign去调用第三方服务,feign服务出现了降级。调用第三方api,第三方api调用失败,是通过 错误吗 来告知是成功还是失败的。

class 手动回滚分布式事物{ public void 部分代码() { if (RootContext.inGlobalTransaction()) { try { GlobalTransactionContext.reload(RootContext.getXID()).rollback(); } catch (TransactionException e) { log.error("回滚分布式事物出现异常", e); } } } }

访问请求:

$ curl -X GET <= 5 时,事物回滚,账户服务不扣钱,订单服务不产生订单当账户服务的返回值 > 5 时,账户服务扣钱,订单服务产生订单

2、临时挂起分布式事物

举例:

在一个大的分布式事务中,如果分布式事物的某个环节出现了异常,通过​​try{}catch(){}​​后,需要记录一个日志到数据库中,此处可能需要挂起这个分布式事务,让记录日志的方法不参与到分布式事务中。

下方这个案例是模拟下单操作,下单分为 账户服务扣钱和产生订单,此处将账户服务扣钱操作排除到分布式事务外,产生订单参与分布式事务。

class 临时挂起分布式事物 { @GlobalTransactional(rollbackFor = Exception.class) public void 部分代码(){ String xid = RootContext.getXID(); System.out.println("createAccountOrder:" + xid); // 解除 xid 的绑定 RootContext.unbind(); // 1、远程扣减账户余额 // =============== 此方法不在分布式事务中================= boolean debitResult = remoteDebit(accountId, amount); // =============== 此方法不在分布式事务中================= // 重新绑定 xid RootContext.bind(xid); // 2、下订单 orderService.createOrder(accountId, amount); // 抛出异常 int i = 1 / 0; }}

访问请求:

$ curl -X GET 账户服务扣钱,没有产生订单

三、完整代码

​​参考链接

​​http://seata.io/zh-cn/blog/seata-spring-boot-aop-aspectj.html​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:CanalAdmin搭建Canal Server集群
下一篇:新华制药心血管病药物盐酸地尔硫䓬片通过一致性评价 系国内首家!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~