一、说明

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

二、功能实现

1、手动回滚分布式事物

举例:

  1. 比如我们通过feign去调用第三方服务,feign服务出现了降级。
  2. 调用第三方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

结果:

  1. 当账户服务的返回值 <= 5 时,事物回滚,账户服务不扣钱,订单服务不产生订单
  2. 当账户服务的返回值 > 5 时,账户服务扣钱,订单服务产生订单

2、临时挂起分布式事物

举例:

  1. 在一个大的分布式事务中,如果分布式事物的某个环节出现了异常,通过 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代码控制回滚和临时挂起分布式事物的更多相关文章

  1. SVN代码的回滚二

    SVN代码的回滚: 不丢失新建的文件,获得最新的SVN版本控制.TortoiseSVN-ShowLog-选中你要回滚的版本-右键-Export,之后将修改的文件覆盖到你的最新版本,commit即可. ...

  2. git远程代码库回滚(webstorm下)

    git远程代码库回滚(webstorm下) 1. 场景 添加了一个文件[file-for-test.js]到git的控制下 进行了三次修改,并分别进行了三次commit,最后进行了一次push git ...

  3. git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚

    [git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br  (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退 ...

  4. git远程库代码版本回滚方法

    最近使用git时, 造成了远程库代码需要回滚到之前版本的情况,为了解决这个问题查看了很多资料. 问题产生原因: 提交了错误的版本到远程库. 以下是解决的方法, 供大家参考: 1.对本地代码库进行回滚 ...

  5. 【GIT】git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚

    [git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br  (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退 ...

  6. 【转】git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚

    转载自:http://m.blog.csdn.net/blog/lihongli528628/45483463 [git 删除本地分支] git branch -D br [git 删除远程分支] g ...

  7. tortoisegit 代码的回滚方式 --两种

    TortoiseGit有两种回滚代码方式, 一种是导出指定版本代码为zip格式,不影响源代码:另一种是直接在源代码上回滚, 指定版本之后写的代码都会被删除.下面分别介绍这两种方法: 首先进入版本日志对 ...

  8. jenkins之代码部署回滚脚本

    #!/bin/bash DATE=`date +%Y-%m-%d_%H-%M-%S` METHOD=$1 BRANCH=$2 GROUP_LIST=$3 function IP_list(){ if ...

  9. 利用PyCharm操作Github:仓库新建、更新,代码回滚

      Github是目前世界上最流行的代码存储和分享平台,而PyCharm是Python圈中最流行的IDE,它很好地支持了Git操作.本文将会介绍如何利用PyCharm来连接Github,同时演示Git ...

随机推荐

  1. error: object file .git/objects/...

    cd .git find . -type f -empty -delete -print tail -n 2 .git/logs/refs/heads/master git show xxxx(版本号 ...

  2. C# Dapper基本三层架构使用 (四、Web UI层)

    三层架构的好处,一套代码无论WinForm还是Web都可以通用,只写前台逻辑就可以了,现在展示Web调用三层的示例 首先在项目中创建一个Web MVC5项目,目前项目目录如下 在Web项目Web.co ...

  3. Docker Compose 实践及梳理

    Docker Compose 可以实现 Docker 容器集群的编排,可以通过 docker-compose.yml 文件,定义我们的服务及其需要的依赖,轻松地运行在测试.生产等环境 文档 Produ ...

  4. 洛谷P1803——凌乱的yyy(贪心)

    题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加几个比赛. 由于yyy是蒟蒻,如果要参加 ...

  5. AS插件快速生成javabean

    https://blog.csdn.net/u010227042/article/details/103803198

  6. 修改 CubeMX 生成的 RT-Thread makefile 工程

    修改 CubeMX 生成的 RT-Thread makefile 工程 使用 RT-Thread 官方 基于 CubeMX 移植 RT-Thread Nano 生成的 Makefile 工程在编译时有 ...

  7. Docker DevOps实战:Docker+Jenkins+Python+Pytest+Allure(2)- Jenkins初始化、Jenkins插件、Jenkins配置、自动化测试

    Jenkins初始化 step-1 访问Jenkins http://ip:80  step-2 查看密码.输入密码 # 方式一:通过查看容器日志 [root@localhost ~]# docker ...

  8. Dockers(29)- 网络连通

    网络连通 背景 基于docker0建了两个容器tomcat01和tomcat02,网段位于172.12.0.0/16 我们又新建了一个网络,网段为192.168.0.0/16,基于此网段新建了两个容器 ...

  9. k8s-PodApi对象

    init容器 pod的生命周期钩子 资源限制 podApi对象概览 apiVersion + kind  一个是版本 一个是资源组  共同确定当前yaml由谁来管理 metadata元数据 用来唯一标 ...

  10. 鸿蒙内核源码分析(管道文件篇) | 如何降低数据流动成本 | 百篇博客分析OpenHarmony源码 | v70.01

    百篇博客系列篇.本篇为: v70.xx 鸿蒙内核源码分析(管道文件篇) | 如何降低数据流动成本 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...