我们在二十一、springCloudAlibaba-seata测试环境准备进行了seata测试的环境准备,现在我们引入seata来解决分布式事务的问题。
1、引入依赖
我们在订单服务和库存服务都引入依赖
<!--引入seata依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
2、配置文件加上事务分组
我们在订单服务和库存服务都加上
spring:cloud:alibaba:seata:tx-service-group: guangzhou
这是因为我们搭建seata服务的时候配置用的就是guangzhou,可参考二十、springCloudAlibaba-seata环境搭建TC(Server端)
config.xml
service.vgroupMapping.guangzhou=default
3、配置注册中心和配置中心
我们在订单服务和库存服务都加上
seata:registry:#配置seata的注册中心,告诉seata client 怎么去访问seata server(TC)type: nacosnacos:server-addr: 127.0.0.1:8848application: seata-server #默认即是seata-serverusername: nacospassword: nacosgroup: SEATA_GROUP #默认即是SEATA_GROUPconfig:#配置seata的注册中心type: nacosnacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosgroup: SEATA_GROUP
4、建回滚日志表
我们在订单库和库存库都要加上
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=1 DEFAULT CHARSET=utf8;
5、修改订单业务逻辑的事务注解
这里只需要修改订单的,库存的不需要改为@GlobalTransactional
@GlobalTransactional@Overridepublic String add(Long merchId) {System.out.println("新增订单开始"+merchId);Order order = new Order();order.setOrderNo(1l);order.setOrderName("新增订单,对应商品"+merchId);orderMapper.insert(order);System.out.println("新增订单结束"+merchId);//新增订单stockService.reduce(1l);System.out.println("扣减库存结束"+merchId);int i =1/0;return null;}
6、测试验证
测试发现,因为1/0报错了,导致事务回滚,然后库存库的也回滚了,成功解决问题,我们还可以在int i= 1/0;打个断点,可以发现undo_log表是有记录的。
原理和源码这里就不深究先啦!
ok!
