Seata文档配置
1、简要说明Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
一阶段:事务协调者通知每一个服务处理本地事务,每个服务开始处理但是不会提交事务,处理完毕后告知协调者。
二阶段:协调者收到所有服务的消息后通知他们提交事务。
Seata的工作机制:
一阶段:先解析SQL生成前后镜像,插入回滚日志,在提交事务前,向协调者申请全局锁后,然后提交本地事务,将提交结果发送给协调者。
二阶段-回滚:收到协调者的回滚请求,执行逆向SQL。
二阶段-提交:收到协调者的提交请求,把请求放入队列中,立刻返回成功结果给协调者。删掉UNDOLOG。
Seata的AT模式:
前提基于支持本地 ACID 事务的关系型数据库。
参与者在本地提交事务,然后返回给协调者,如果参与者发送了提交事务失败,那么协调者就会告知所有参与者回滚,否则会告知所有参与者成功,然后删掉UNDOLOG。
Seata官方文档:https://seata.io/zh-cn/index.html
通过dataId上传配置至Nacos配置中心
(PS:最新版本-1.4.2开始支持,使用比较简单。如果使用老版本配置结构不一样,本文档不做说明)
步骤:
1首先你需要在nacos新建配置,此处dataId为seataServer.properties,配置内容参考https://github.com/seata/seata/tree/develop/script/config-center 的config.txt并按需修改保存
或者
2将下方zip包导入nacos,更改数据库为本地相关内容
1.下载seata的server端最新版(1.4.2)并解压
https://github.com/seata/seata/releases
2.修改 conf/registry.conf 配置
注册中心和配置中心默认是file这里改为nacos;设置 registry 和 config 节点中的type为nacos,修改serverAddr为你的nacos节点地址。
4.初始化数据库
创建一个名为 seata 的数据库,并执行一下sql
Sql地址:
https://github.com/seata/seata/blob/develop/script/server/db/mysql.sql
或者
5.启动seata-server
Windows执行seata-server-1.4.2bin的 seata-server.bat
1.增加maven依赖
1.1没有数据库操作的服务(事务发起者):
com.alibaba.cloud spring-cloud-starter-alibaba-seata
1.2有数据库操作的服务(各业务层参与者):
com.xxxx icp-common-seata ${project.version}
(icp-common-seata依赖包详见下方5.1应用配置 配置数据源代理)
2.在client客户端(项目中application.yml)加入对应的配置中心和注册中心,红色部分根据实际情况填写
seata:
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
group : "SEATA_GROUP"
namespace: ""
dataId: "seataServer.properties"
username: "nacos"
password: "nacos"
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
group : "SEATA_GROUP"
namespace: ""
username: "nacos"
password: "nacos"
PS注意:nacos在项目中的配置需要添加指定group,进行分组管理
最后,启动 Seata-Server 后,会发现Server端的服务出现在 Nacos 控制台中的注册中心列表中. Client 配置完成后启动应用就可以正式体验 Seata 服务。
5、应用配置1.配置数据源代理
在common模块下添加新模块common-seata
引入依赖
com.xxxx common-mybatis com.alibaba.cloud spring-cloud-starter-alibaba-seata
Seata是通过代理数据源实现分布式事务,所以需要配置
io.seata.rm.datasource.DataSourceProxy的Bean,且是@Primary默认的数据源,否则事务不会回滚,无法实现分布式事务
public class DataSourceProxyConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Primary
@Bean
public DataSourceProxy dataSourceProxy(DruidDataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
}
- 事务发起者添加全局事务注解
事务发起者 business-service 添加 @GlobalTransactional 注解
@GlobalTransactional
public void placeOrder(String userId) {
......
}
示例:



