微服务需要分布式事务来解决事务问题,这里用seata作为分布式事务解决方案
官方文档:http://seata.io/zh-cn/docs/user/quickstart.html
- 每一个微服务新建undo_log表
CREATE TABLE `undo_log` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`branch_id` BIGINT NOT NULL,
`xid` VARCHAR(100) NOT NULL,
`context` VARCHAR(128) NOT NULL,
`rollback_info` LONGBLOB NOT NULL,
`log_status` INT(11) DEFAULT 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 DEFAULT CHARSET=utf8mb4;
- 整合
导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
导入后可以看到这里的seata版本是071,那么我们就下载071的版本
下载链接https://github.com/seata/seata/releases/tag/v0.7.1
3. 编写一个seata配置
@Configuration
public class MySeataConfig {
@Autowired
DataSourceProperties dataSourceProperties;
@Bean
public DataSource dataSource(){
HikariDataSource dataSource =dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
if(StringUtils.hasText(dataSourceProperties.getName())){
dataSource.setPoolName(dataSourceProperties.getName());
}
return new DataSourceProxy(dataSource);
}
}
- 将file.conf和registry.conf拷贝到项目中
修改file.conf配置信息:vgroup_mapping.{application name}-fescar-service-group = "default"
- 通过注解@GlobalTransactional来进行分布式事务
注:这一个方案不适合高并发,只适合并发很低的多次服务调用事务处理。