分布式事务-(2)Seata篇

一,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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值