个人随笔
目录
二十二、springCloudAlibaba-seata测试验证(完)
2023-11-08 22:11:46

我们在二十一、springCloudAlibaba-seata测试环境准备进行了seata测试的环境准备,现在我们引入seata来解决分布式事务的问题。

1、引入依赖

我们在订单服务和库存服务都引入依赖

  1. <!--引入seata依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  5. </dependency>

2、配置文件加上事务分组

我们在订单服务和库存服务都加上

  1. spring:
  2. cloud:
  3. alibaba:
  4. seata:
  5. tx-service-group: guangzhou

这是因为我们搭建seata服务的时候配置用的就是guangzhou,可参考二十、springCloudAlibaba-seata环境搭建TC(Server端)
config.xml

  1. service.vgroupMapping.guangzhou=default

3、配置注册中心和配置中心

我们在订单服务和库存服务都加上

  1. seata:
  2. registry:
  3. #配置seata的注册中心,告诉seata client 怎么去访问seata server(TC)
  4. type: nacos
  5. nacos:
  6. server-addr: 127.0.0.1:8848
  7. application: seata-server #默认即是seata-server
  8. username: nacos
  9. password: nacos
  10. group: SEATA_GROUP #默认即是SEATA_GROUP
  11. config:
  12. #配置seata的注册中心
  13. type: nacos
  14. nacos:
  15. server-addr: 127.0.0.1:8848
  16. username: nacos
  17. password: nacos
  18. group: SEATA_GROUP

4、建回滚日志表

我们在订单库和库存库都要加上

  1. CREATE TABLE `undo_log` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `branch_id` bigint(20) NOT NULL,
  4. `xid` varchar(100) NOT NULL,
  5. `context` varchar(128) NOT NULL,
  6. `rollback_info` longblob NOT NULL,
  7. `log_status` int(11) NOT NULL,
  8. `log_created` datetime NOT NULL,
  9. `log_modified` datetime NOT NULL,
  10. `ext` varchar(100) DEFAULT NULL,
  11. PRIMARY KEY (`id`),
  12. UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
  13. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

5、修改订单业务逻辑的事务注解

这里只需要修改订单的,库存的不需要改为@GlobalTransactional

  1. @GlobalTransactional
  2. @Override
  3. public String add(Long merchId) {
  4. System.out.println("新增订单开始"+merchId);
  5. Order order = new Order();
  6. order.setOrderNo(1l);
  7. order.setOrderName("新增订单,对应商品"+merchId);
  8. orderMapper.insert(order);
  9. System.out.println("新增订单结束"+merchId);
  10. //新增订单
  11. stockService.reduce(1l);
  12. System.out.println("扣减库存结束"+merchId);
  13. int i =1/0;
  14. return null;
  15. }

6、测试验证

测试发现,因为1/0报错了,导致事务回滚,然后库存库的也回滚了,成功解决问题,我们还可以在int i= 1/0;打个断点,可以发现undo_log表是有记录的。

原理和源码这里就不深究先啦!

ok!

 66

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2