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