1.说明这里只是简单的记录一下。使用Seata后,如何手动回滚分布式事务和临时挂起分布式事务?Seata的集成就不做详细说明了。二、功能实现1、分布式事物手动回滚示例:比如我们通过feign调用第三方服务,feign服务降级。调用第三方api,如果第三方api调用失败,通过“error?”通知是成功还是失败。类手动回滚分布式事务{publicvoidpartcode(){if(RootContext.inGlobalTransaction()){try{GlobalTransactionContext.reload(RootContext.getXID()).rollback();}catch(TransactionExceptione){日志。error("回滚分布式事务时出现异常",e);}}}}访问请求:$curl-XGEThttp://localhost:50017/rollbackTx\?accountId\=1\&amount\=10\&hasException\=false结果:当账户服务的返回值<=5、交易回滚,账户服务不扣款,订单服务不生成订单。当账户服务返回值>5时,账户服务扣钱,订单服务生成订单2,分布式事物的临时中断示例:在一个大的分布式事务中,如果某个部分出现异常分布式的东西,通过try{}catch(){}之后,需要在数据库中记录一个日志,这个可能需要暂停分布式事务,让logging方法不参与分布式事务。以下案例为模拟下单操作。下单分为账户服务扣款和订单生成。这里将账户服务扣费操作排除在分布式事务之外,生成的订单参与分布式事务。class暂时停止分布式事务{@GlobalTransactional(rollbackFor=Exception.class)publicvoidpartofthecode(){Stringxid=RootContext.getXID();System.out.println("createAccountOrder:"+xid);//取消绑定xidRootContext.unbind();//1.远程扣除账户余额//================这种方法在分布式事务中是没有的=================booleandebitResult=remoteDebit(accountId,amount);//================此方法不在分布式事务中=================//重新绑定xidRootContext.bind(xid);//2.下订单orderService.createOrder(accountId,amount);//抛出异常inti=1/0;}}访问请求:$curl-XGEThttp://localhost:50017/bindAndUnBind\?accountId\=1\&amount\=10\&hasException\=false结果:账户服务扣钱,不生成订单3.完整代码https://gitee.com/huan1993/spring-cloud-parent/tree/master/seata/seata-springboot-rollback-tx四个参考链接http://seata.io/zh-cn/blog/seata-spring-启动-aop-aspectj.html
