Seata原理(转自官方文档:https://github.com/seata/seata/wiki/%E6%A6%82%E8%A7%88)
- Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
- Transaction Manager (TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
- Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
一个典型的分布式事务过程:
- TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID。
- XID 在微服务调用链路的上下文中传播。
- RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖。
- TM 向 TC 发起针对 XID 的全局提交或回滚决议。
- TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
相关下载路径
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版本回滚不生效。