一,Seata是什么
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案
seata官方文档:https://seata.io/zh-cn/docs/overview/what-is-seata.html
二,Seata控制分布式事务步骤
1,会加很多锁,是串行化,不适合高并发模式
2,高并发模式建议使用 柔性事务:可靠消息投递+最终一致性
引入延时队列-起到定时任务的作用;
第一步:每个服务的数据库都要一个回滚日志表
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
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;
第二步:下载seata协调服务器
https://github.com/seata/seata/releases
第三步:整合
加入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
注:会导入io.seata:seata-all-***(seata协调服务的版本要与此jar包的版本一致)
第四步:启动seata服务器
配置文件名:registry.conf
第五步:开启全局事务
@GlobalTransactional // 在方法上增加注解
@Transactional // 必须也得有这个
https://github.com/seata/seata-samples/tree/master/springcloud-jpa-seata
所有的用到分布式事务的微服务,都要用seata代理自己的数据源--都要进行如下配置
import com.zaxxer.hikari.HikariDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import javax.sql.DataSource;
/**
* 代理数据源
*/
@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);
}
}
.file.conf 的 service.vgroup_mapping 配置必须和spring.application.name一致
1,把seata的file.conf和registry.conf放到每个微服务的resources文件里
2,在 org.springframework.cloud:spring-cloud-starter-alibaba-seata的org.springframework.cloud.alibaba.seata.GlobalTransactionAutoConfiguration类中,默认会使用 ${spring.application.name}-fescar-service-group作为服务名注册到 Seata Server上,如果和file.conf中的配置不一致,会提示 no available server to connect错误
也可以通过配置 spring.cloud.alibaba.seata.tx-service-group修改后缀,但是必须和file.conf中的配置保持一致
注:给分布式的大事务的入口标注
@GlobalTransactional
@Transactional
给被远程调用的接口标注
@Transactional