seata代码控制回滚和临时挂起分布式事物
seata代码控制回滚和临时挂起分布式事物
一、说明
此处只是简单的记录一下,使用了 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 http://localhost:50017/rollbackTx\?accountId\=1\&amount\=10\&hasException\=false
结果:
- 当账户服务的返回值 <= 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://localhost:50017/bindAndUnBind\?accountId\=1\&amount\=10\&hasException\=false
结果: 账户服务扣钱,没有产生订单
三、完整代码
https://gitee.com/huan1993/spring-cloud-parent/tree/master/seata/seata-springboot-rollback-tx
四 参考链接
http://seata.io/zh-cn/blog/seata-spring-boot-aop-aspectj.html
seata代码控制回滚和临时挂起分布式事物的更多相关文章
- SVN代码的回滚二
		
SVN代码的回滚: 不丢失新建的文件,获得最新的SVN版本控制.TortoiseSVN-ShowLog-选中你要回滚的版本-右键-Export,之后将修改的文件覆盖到你的最新版本,commit即可. ...
 - git远程代码库回滚(webstorm下)
		
git远程代码库回滚(webstorm下) 1. 场景 添加了一个文件[file-for-test.js]到git的控制下 进行了三次修改,并分别进行了三次commit,最后进行了一次push git ...
 - git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚
		
[git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退 ...
 - git远程库代码版本回滚方法
		
最近使用git时, 造成了远程库代码需要回滚到之前版本的情况,为了解决这个问题查看了很多资料. 问题产生原因: 提交了错误的版本到远程库. 以下是解决的方法, 供大家参考: 1.对本地代码库进行回滚 ...
 - 【GIT】git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚
		
[git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退 ...
 - 【转】git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚
		
转载自:http://m.blog.csdn.net/blog/lihongli528628/45483463 [git 删除本地分支] git branch -D br [git 删除远程分支] g ...
 - tortoisegit 代码的回滚方式 --两种
		
TortoiseGit有两种回滚代码方式, 一种是导出指定版本代码为zip格式,不影响源代码:另一种是直接在源代码上回滚, 指定版本之后写的代码都会被删除.下面分别介绍这两种方法: 首先进入版本日志对 ...
 - jenkins之代码部署回滚脚本
		
#!/bin/bash DATE=`date +%Y-%m-%d_%H-%M-%S` METHOD=$1 BRANCH=$2 GROUP_LIST=$3 function IP_list(){ if ...
 - 利用PyCharm操作Github:仓库新建、更新,代码回滚
		
Github是目前世界上最流行的代码存储和分享平台,而PyCharm是Python圈中最流行的IDE,它很好地支持了Git操作.本文将会介绍如何利用PyCharm来连接Github,同时演示Git ...
 
随机推荐
- DataTable 增加、修改、删除
			
using System; using System.Data; using System.Windows.Forms; using DotNet.Utilities; namespace Windo ...
 - 数据导出生成word附件使用POI的XWPFTemplate对象
			
比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel.Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组 ...
 - 使用@EnableConfigurationProperties注册配置Bean时的命名规则
			
Spring和Spring Boot开发中,常使用@ConfigurationProperties注解某个类,使其实例接受一组具有相同前缀的配置项. 可以使用@Component或Java Confi ...
 - WPF 通过进程实现异常隔离的客户端
			
当 WPF 客户端需要实现插件系统的时候,一般可以基于容器或者进程来实现.如果需要对外部插件实现异常隔离,那么只能使用子进程来加载插件,这样插件如果抛出异常,也不会影响到主进程.WPF 元素无法跨进程 ...
 - Ansible快速实战指南----多机自动化执行命令、部署神器
			
1.需求: 需要在多台主机上,发送文件.执行命令,进行快速部署 2.ansible 远程复制文件 例子:在当前节点(20.88.14 ...
 - String底层使用是char数组还是byte数组
			
结论:jdk1.8及以前String底层使用是char[],1.9开始使用byte[] jdk1.8 jdk13
 - Java实现导入Excel文件
			
一.配置文件名称.路径.内容: <bean id="multipartResolver" class="org.springframework.web.multip ...
 - css3 animate转圈360旋转
			
.logo{ width:20px; height: 20px; background: red; -webkit-animation:haha1 .8s linear infinite; anima ...
 - Mysql Navicate 基础操作与SQL语句 版本5.7.29
			
SQL数据的增删改查:此部分所有SQL语句在navicat中与mysql命令行执行效果一样,只是mysql服务端在命令行执行,而navicat只是在客户端的图形化打开操作. 一.进入数据库 .连接数据 ...
 - ❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️
			
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文会重点介绍如何创建第一个Android应用,以及如何使用Android Studio进行调试 干货满满,建议收藏,需要用到时常看看.小伙伴们如 ...