分布式事务-(2)Seata篇

一,Seata是什么

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案
seata官方文档:https://seata.io/zh-cn/docs/overview/what-is-seata.html

分布式事务-(2)Seata篇_第1张图片

二,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

第三步:整合

加入依赖
	
        com.alibaba.cloud
        spring-cloud-starter-alibaba-seata
    
注:会导入io.seata:seata-all-***(seata协调服务的版本要与此jar包的版本一致)

第四步:启动seata服务器

配置文件名:registry.conf

分布式事务-(2)Seata篇_第2张图片

第五步:开启全局事务

@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中的配置保持一致

分布式事务-(2)Seata篇_第3张图片
分布式事务-(2)Seata篇_第4张图片

注:给分布式的大事务的入口标注 
@GlobalTransactional
@Transactional
给被远程调用的接口标注
  @Transactional 

你可能感兴趣的:(分布式事务,后端开发,java)