seata
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
server端
点击下载
mysql-sql
全局事务会话信息由3块内容构成,全局事务–>分支事务–>全局锁,对应表global_table、branch_table、lock_table
1 | -- -------------------------------- The script used when storeMode is 'db' -------------------------------- |
实际操作中遇见
io.seata.core.exception.TmTransactionException: TransactionException[begin global request failed. xid=null, msg=Data truncation: Data too long for column 'transaction_service_group' at row 1]
错误global_table表的transaction_service_group字段在存放事务组名称“tx-seata-user-seata-service-group”时超过长度,手动调长了该字段长度
注册中心
记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用.比如Seata Client端(TM,RM),发现Seata Server(TC)集群的地址,彼此通信.
启动包: seata–>conf–>registry.conf
file:
1 | #注册中心 |
1 | registry { |
配置中心
放置着各种配置文件,你可以通过自己所需进行获取配置加载到对应的客户端.比如Seata Client端(TM,RM),Seata Server(TC),会去读取全局事务开关,事务会话存储模式等信息.
conf–>file.conf,根据store.mode=”db或者redis”去加载存储于不同渠道的配置
1 | ## transaction log store, only used in seata-server |
启动命令
源码启动: 执行Server.java的main方法
命令启动: seata-server.sh -h 127.0.0.1 -p 8091 -m db -n 1 -e test
-h: 注册到注册中心的ip
-p: Server rpc 监听端口
-m: 全局事务会话信息存储模式,file、db、redis,优先读取启动参数 (Seata-Server 1.3及以上版本支持redis)
-n: Server node,多个Server时,需区分各自节点,用于生成不同区间的transactionId,以免冲突
-e: 多环境配置参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html
环境隔离
Seata从0.6.1开始支持多配置隔离,假设我们现在有一个测试环境,在这个测试环境中,我们希望只读取与测试环境相对应的配置项。
1、环境配置
Seata提供了两种方法来设置不同的环境:-e test
,其中test是环境的名称。(这只能用于服务器端)
例如(Linux)
Sh seata-server.sh -e test
使用SEATA_ENV作为环境变量的键,它的值将是环境的名称。(这只能用于客户端)[推荐]
例如(Linux)
1 | vi /etc/profile |
使用seataEnv作为jvm选项的键,它的值将是环境的名称。(这只能用于客户端)[推荐]-DseataEnv=test
2、为新配置文件命名
将file.conf
复制并重命名为file-env.conf
,其中env
是环境的名称。例如file-test.conf
复制并重命名registry.conf
到registry-env.conf
,其中env
是环境的名称。例如registry-test.conf
在“registry-test.conf”文件中修改如下内容:
1 | registry { |
设置完所有步骤后,就可以开始使用Seata配置隔离了。
client端
AT模式
两阶段提交协议的演变:
- 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源(与传统的2PC区别,一阶段不占用资源)。
- 二阶段:
- 提交异步化,非常快速地完成。
- 回滚通过一阶段的回滚日志进行反向补偿。
mysql-sql
1 | -- for AT mode you must to init this sql for you business database. the seata server not need it. |
pom
1 | <!-- seata --> |
注册中心
1 | registry { |
file模式(默认)
file加载模式:在在每个客户端的resource下增加registry.conf
和file.conf
文件
eureka模式
1 | #客户端yml配置 |
配置中心
registry.conf
1 |
|
file.conf
1 | transport { |
file模式(默认)
file加载模式:在在每个客户端的resource下增加registry.conf
和file.conf
文件
注解
加载需要控制的业务方法上
1 | .class) (rollbackFor = Exception |
TCC模式
相关配置参照AT模式,TCC模式不依赖于底层数据资源的事务支持。
- 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
- 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
- 二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
java
业务入口,添加@GlobalTransactional
注解
1 | .class) (rollbackFor = Exception |
业务接口层,维护tcc各阶段逻辑
1 |
|
跨服务之间调用的事务保证实现方式一致。