springboot 集成 seata 实现 跨服务 分布式事务

 为啥子标题这样写 以前看了很多很多很多关于分布式事务的 博客 和资料 但是发现 很多分布式事务 的服务 必须在一个注册中心上 ,这时候我就在想  如果两个项目 不在一个注册中心上 就是根本没有关联,连接的不是一个库,就是单纯的A 调用 B 通过原始的http 调用 能不能实现分布式事务    ,百度了好多 没有找到相关博客 废话不多说直接上代码 这里我用的是seata 1.1。

我这里用两个项目 一个是 springboot  项目  ,一个是springCloud 项目  当然正常的项目肯定不会出现 springboot 项目调用 springcloud 项目 肯定都会集成到 springcloud 我这里就是要做这样的实验 看看 能不能成功。

springcloud 集成seata 的话 大家可以看 看百度 很多 没什么复杂的 

我这里主要讲 springboot 集成的seata  需要的jar包 我这里用的版本是2.1.5 这个版本一定要选对 大家可以百度百度 每个seata 对应版本不同 对应的 spring 的版本也不同 大家可以看看 以前也遇到过版本问题 很坑 

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependncy>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.1.0</version>
</dependency>


seata:
  enabled: true
  tx-service-group: zjf-nacos-group
  applicationId: base2020
  service:
    grouplist:
      default: 你的seata 的连接地址
    vgroup-mapping:
      zjf-nacos-group: default
    disable-global-transaction: false

然后 你那个数据库需要用到 分布式事务 就加入这个表 主要是用来回滚的 seata 官网有的
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8;

 

除了加入seata 的注解 还要加本地事务 注解 我们知道 分布式事务回滚也是利用本地事务进行回滚的

你的调用方也要加上seata 的注解  和本地事务注解

ok 相信大家都看到了为什么有xid 这个参数 

现在给大家解释

我先把xid 给去掉演示一下结果

启动项目的时候 看到下面的信息 will connect 就证明你的seata 连接成功了

我A 项目抛了一个空指针 A 可以看到是回滚了 我标记的那个是XID 

b 项目 可以看到  自己操作成功了 就证明没有回滚 我们在看b 项目生成的xid

两个完全不同的xid 这个xid 就是 seata生成 的全局事务id 由此可见 两个项目没有关联 直接通过http 调用 生成的xid 是不同的  所以不会回滚

至于为什么调用没有依赖就不会生成相同的xid 还需要大家自己去研究 我是没有找到相关介绍

这个时候我们如果想要回滚只需要 将我们A 项目生成的全局事务XId 调用B 的时候传给B 就行了

项目A

项目B 将xid 给接收到  并将事务的XID 替换成接收的

这样的话我们再次调用

项目a 我们看到一件回滚了

项目b同样也回滚了 我们可以看到他们的xid 都是2044335751

这个时候跨服务的事务 就成功了  两个都回滚了 这就成功了

参考博客 

https://blog.csdn.net/u014004279/article/details/97155451

https://www.cnblogs.com/javashare/p/12535702.html

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值