上一篇记录了 Seata 的配置和启动,这一篇我们实际操作一下 seata 的分布式事务的效果,首先引入 maven 依赖,我们这里seata用的是 1.2 版本,尽量跟随版本走
<!--seata-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.1.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>1.2.0</version>
</dependency>
第二步,将 seata 的两个配置文件 registry.conf file.conf 复制到项目中去,里面的配置就是上一篇的配置,无需更改
第三步,在配置文件中,加入事务组,这个名字,也是上一篇里面的名字,如果更改了名字,这里也需要更改,每个项目都是一样的配置,
############## seata配置 ##############
spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group
第四步,开启数据库代理 ,在启动类上加上注解
@EnableAutoDataSourceProxy
第五步,在微服务之间的调用方式上加上注解 @GlobalTransactional(rollbackFor = Exception.class)
这里贴一下测试的代码
@Override
@GlobalTransactional(rollbackFor = Exception.class)
//@Transactional(rollbackFor = Exception.class)
public Object updateAge(int age) {
// 本服务 修改数据
testUserMapper.updateAge(age);
// 通过 fegin 调用服务
testService.updateUserName("test");
// 两个都执行成功时,这里发生异常 测试是否两个库的数据都会回滚
System.out.println(1/0);
return 1;
}
接下来我们进行测试,微服务直接的调用,这里采用的是 feign
这个 undo_log 是上一步我们建在各个服务所用的数据库中,我这里是两个不同的库,可以看到,分布式事务,两个库中的 XID 是一致的,表明他们是一个事务,这个日志在你代码执行完毕就会没有,这里我是打 debug 时,进来查看的,如果这时程序报错,两个事务都会回滚,大家可以自行测试一下