我们在二十一、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: nacos
nacos:
server-addr: 127.0.0.1:8848
application: seata-server #默认即是seata-server
username: nacos
password: nacos
group: SEATA_GROUP #默认即是SEATA_GROUP
config:
#配置seata的注册中心
type: nacos
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
group: 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
@Override
public 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!