Seata
- 官网地址
- 一次业务操作需要跨多个数据源或者需要跨多个系统进行远程调用,就会产生分布式事务问题
- Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
分布式事务处理过程
- TM 向 TC 申请一个全局事务,全局事务创建成功并生成一个全局唯一的 XID
- XID 向微服务调用链路的上下文中传播
- RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖
- 事务一阶段结束
- TM 向 TC 发起针对 XID 的全局提交或者回滚决议
- TC 调度 XID 下管辖的全部分支事务完成提交或者回滚请求
- 事务二阶段结束
名词介绍
- Transaction ID XID:全局唯一的事务ID
- Transaction Coordinator(TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或者回滚
- Transaction Manager(TM):控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或者全局回滚的决议
- Resource Manager(RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚
下载
- 官网地址
- 此例子安装的是0.9版本,如果需要安装最新版请参考官网文档
- 修改 store.mode 改成 db,之后再对应位置修改数据库属性
- 修改 registry.type 改成 nacos,之后再对应位置修改 nacos 配置
- 运行初始化 SQL,老版在 /seata/conf/db_store.db;新版在 seata/script/server/db/mysql.sql
- 运行成功
代码演示
问题
-
seata 版本问题,新版直接将配置注册到 nacos,通过 yml 进行配置;老版需要创建 file.conf、registry.conf文件
-
添加 @GlobalTransactional(name = "fsp-create-order", rollbackFor = Exception.class) 注解之后,会抛出问题(不加正常调用)
- io.seata.rm.datasource.exec.LockConflictException: get global lock fail, xid:xxx, lockKeys:xxx
- 解决: 参考issues 2460 将配置添加
- 将数据库时区与当前时间一致
- 仍抛出 Global lock acquire failed,参考issues 2555、issues 2735暂时仍未解决
feign:
httpclient:
connection-timeout: 60000
connection-timer-repeat: 3000
ribbon:
ConnectTimeout: 60000 # 设置连接超时时间 default 2000
ReadTimeout: 60000 # 设置读取超时时间 default 5000
OkToRetryOnAllOperations: true # 对所有操作请求都进行重试 default false
MaxAutoRetriesNextServer: 20 # 切换实例的重试次数 default 1
MaxAutoRetries: 10 # 对当前实例的重试次数 default 0