微服务分布式事务组件Seata使用指南

Seata原理(转自官方文档:https://github.com/seata/seata/wiki/%E6%A6%82%E8%A7%88)

微服务分布式事务组件Seata使用指南_第1张图片

 

  • Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
  • Transaction Manager (TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
  • Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。

一个典型的分布式事务过程:

  1. TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID。
  2. XID 在微服务调用链路的上下文中传播。
  3. RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖。
  4. TM 向 TC 发起针对 XID 的全局提交或回滚决议。
  5. TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。

Architecture

相关下载路径

seata-server下载:https://github.com/seata/seata/releases

demo下载地址:https://github.com/seata/seata-samples

一、demo示例运行

这里以spring-eureka-seata的demo为例说明

1、修改seata-server的相关配置

  • 修改conf/registry.conf文件

registry.type = "eureka"  #注册发现中心为eureka

registry.eureka.serviceUrl = "${你自己的eureka地址}"

registry.eureka.application = "${seata-server注册到eureka中的应用名称}(1)"

  • 启动seata-server:

sh seata-server.sh -p 8091 -h 127.0.0.1 -m file

2、修改模块配置

  • 修改registry.conf文件

registry.type = "file"

config.type = "file"

  • 修改file.conf文件

service.vgroup_mapping. ${tx-server-group名称}(2) = ${seata-server注册到eureka中的应用名称}(1)

  • 修改application.properties文件

spring.cloud.alibaba.seata.tx.service-group = ${tx-server-group名称}(2)

logging.level.org.springframework.cloud.alibaba.seata.web=debug

logging.level.io.seata=debug

二、移植个人项目中需要添加的配置

1、为所有涉及事务的服务添加数据源代理配置

package com.changingstudy.user.config;

import com.alibaba.druid.pool.DruidDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

/**
 * 数据源配置
 *
 * @author HelloWoodes
 */
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DruidDataSource druidDataSource() {
        return new DruidDataSource();
    }

    /**
     * 需要将 DataSourceProxy 设置为主数据源,否则事务无法回滚
     *
     * @param druidDataSource The DruidDataSource
     * @return The default datasource
     */
    @Primary
    @Bean("dataSource")
    public DataSource dataSource(DruidDataSource druidDataSource) {
        return new DataSourceProxy(druidDataSource);
    }
}

2、在事务触发的起始service部分添加@GlobalTransactional注解

3、在各个涉及的service上添加@Transactional(rollbackFor = Exception.class)注解

4、使用demo中脚本在数据表中建立undo_log表,用于记录回滚异常信息

tip1:spring-cloud-alibaba-seata-0.9.1.BUILD-SNAPSHOT版本中,若对mysql数据表中的byte字段进行了修改,会导致回滚失败,原因是前后数据比对失败。

tip2:spring-cloud-alibaba-seata-0.9.0.RELEASE版本回滚不生效。

 

 

 

 

你可能感兴趣的:(微服务分布式事务组件Seata使用指南)