Steata分布式事务的使用场景是并发量不是很大的后台管理系统。
steate介绍和使用官网:http://seata.io/zh-cn/docs/overview/what-is-seata.html
我们这里使用的分布式事务解决方案是AT模式也即是2pc模式
我们所使用的是0.7.1版本,不同版本可能使用的方式有点区别。
-
seata 要控制分布式事务
-
1)、每一个微服务的数据库必须创建uodo_log表
– 注意此处0.7.1+ 增加字段 context
CREATE TABLEundo_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,
PRIMARY KEY (id
),
UNIQUE KEYux_undo_log
(xid
,branch_id
)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-
2)、安装事务协调器 seata-server https://github.com/seata.seata/releases
registry.conf 注册中心配置 修改registry type=nacos,地址改为nacos的连接地址。
然后启动服务 -
3)、整合
1、导入依赖 spring-cloud-starter-alibaba-seata | seata-all-0.7.1
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
- 3、所有想要用到分布式事务的微服务使用seata DataSourceProxy
@Configuration
public class MySeataConfig {
@Autowired
DataSourceProperties dataSourceProperties;
@Bean
public DataSource dataSource(DataSourceProperties dataSourceProperties) {
HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
if (StringUtils.hasText(dataSourceProperties.getName())) {
dataSource.setPoolName(dataSourceProperties.getName());
}
return new DataSourceProxy(dataSource);
}
}
- 4、每个服务都导入
registry.conf, file.conf
file.conf 的 service.vgroup_mapping 配置必须和spring.application.name一致
设置:vgroup_mapping.gulimall-order-fescar-service-group = “default”,也可以通过配置 spring.cloud.alibaba.seata.tx-service-group修改后缀,但是必须和file.conf中的配置保持一致
- 5、大事务:@GlobalTransactional
- 6、远程小事务:@Transactional
入口处就使用@GlobalTransactional,而其他的远程调用开启事务的是就使用本地事务@Transactional即可