为啥子标题这样写 以前看了很多很多很多关于分布式事务的 博客 和资料 但是发现 很多分布式事务 的服务 必须在一个注册中心上 ,这时候我就在想 如果两个项目 不在一个注册中心上 就是根本没有关联,连接的不是一个库,就是单纯的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.youkuaiyun.com/u014004279/article/details/97155451