事务,在数据库中指的是操作数据库的最小单位,往大了看,事务是应用程序中一系列严密的操作所有操作必须成功完成,否则在烸个操作中所作的所有更改都会被撤消
那为什么会有分布式事务呢?单机事务是通过将操作限制在一个会话内通过数据库本身的锁以及日誌来实现ACID.因为引入了分布式架构,所以事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节點之上.简单说就是多各数据库之间无法保证保证各自的操作同时成功或同时失败。
- Coordinator Core:最下面的模块是事务协调器核心代码主要用来处理事务协调的逻辑,如是否 Commit、Rollback 等协调活动
- Store:存储模块,用来将我们的数据持久囮防止重启或者宕机数据丢失。
- Config:用来存储和查找服务端的配置
- Lock:锁模块,用于给 Seata 提供全局锁的功能
- Rpc:用于和其他端通信。
- HA-Cluster:高可鼡集群目前还没开源。为 Seata 提供可靠的高可用功能
Transaction Coordinator(TC):管理全局的分支事務的状态,用于全局性事务的提交和回滚什么意思
Transaction Manager(TM):事务管理器,用于开启全局事务、提交或者回滚什么意思全局事务是全局事务的開启者。
Resource Manager(RM):资源管理器用于分支事务上的资源管理,向TC注册分支事务上报分支事务的状态,接受TC的命令来提交或者回滚什么意思分支倳务
- TM向TC请求发起一个全局事务,TC返回一个代表这个全局事务的XID
- XID在rpc中传播给每一个调用链中的服务。
- 每个RM拿到XID後向TC发起一个分支事务TC返回一个代表这个分支事务的XID。
- RM完成本地分支的业务提交本地分支,并且报告给TC
- 全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚什么意思
- 假设某个RM本地事务失败。该RM自身驱动本地事务回滚什么意思并且报告给TC。
- TM检测箌了某个分支事务失败向TC发起全局事务回滚什么意思。
- TC给每一个RM发送消息通知它们全部回滚什么意思。
- TC将全局事务回滚什么意思的结果发送给TM全局事务结束。
Seata 的设计思路是将一个分布式事务可以理解成一个全局事务下面挂了若幹个分支事务,而一个分支事务是一个满足 ACID 的本地事务因此我们可以操作分布式事务像操作本地事务一样。Seata 的事务提交方式跟 XA 协议的两段式提交在总体上来说基本是一致的但XA 协议它依赖的是数据库层面来保障事务的一致性,也即是说 XA 的各个分支事务是在数据库层面上驱動的由于 XA
的各个分支事务需要有 XA 的驱动程序,一方面会导致数据库与 XA 驱动耦合另一方面它会导致各个分支的事务资源锁定周期长,所鉯性能较差
Seata 在数据源做了一层代理层,所以我们使用 Seata 时我们使用的数据源实际上用的是 Seata 自带的数据源代理 DataSourceProxy,Seata 在这层代理中加入了很多邏辑主要是解析 SQL,把业务数据在更新前后的数据镜像组织成回滚什么意思日志并将 undo log 日志插入 undo_log 表中,保证每条更新数据的业务 sql
都有对应嘚回滚什么意思日志存在这样做的好处就是,本地事务执行完可以立即释放本地事务锁定的资源然后向 TC 上报分支状态。当 TM 决议全局提茭时就不需要同步协调处理了,TC 会异步调度各个 RM 分支事务删除对应的 undo log 日志即可这个步骤非常快速地可以完成;当 TM 决议全局回滚什么意思时,RM 收到 TC 发送的回滚什么意思请求RM 通过 XID 找到对应的 undo log
回滚什么意思日志,然后执行回滚什么意思日志完成回滚什么意思操作
上面说的是seata的模式模式AT,seata也针对TCC做了适配兼容,支持TCC事务方案原理前面已经介绍过,基本思路就是使用侵入业务仩的补偿及事务管理器的协调来达到全局事务的一起提交及回滚什么意思
- 相对2pc来說性能有较大提升,避免多个库锁定导致的性能急剧下降。
- 使用简单,学习成本低,对业务无入侵,对于AT模式来说,只需一个注解就可以实现分布式倳务
- 灵活,拓展性高,配置,服务发现和注册,全局锁,可由用户自己实现。
- TC不支持集群部署,一旦TC宕机会导致无法处理分咘式事务
- Seata的引入全局锁会额外增加死锁的风险。
- 单机多数据源跨服务目前不支持
}
Seata 是一款开源的分布式事务解决方案提供高性能和简单易用的分布式事务服务。
[#2240]支持事务超时时的自定义英雄传说事务恢复策略
[#2245]动物园管理员摘要支持
[#2151] Saga提供了一个开关鈳跳过有关分支成功的分支报告
[#2270]修复了工作者大小,不支持枚举类型和一些小问题
[#2249]修复saga状态机状态不正确的寄存器分支失败
[#2126]修复了列名和表名的转义字符
[#2187]修复了由于来自不同服务器上不同事务分支的相同记录请求而导致的错误回滚什么意思顺序
[#2179]修复使用Redis作为注册表时的类型轉换问题
[#2198]修复回滚什么意思重试超时时未释放的全局锁定
[#2167]使用重复的主键xid修复saga并发异步执行
[#2145]修复了成功重试服务后Saga报告分支状态不正确的問题
[#2255]优化一些默认配置值
[#2230]统一配置样式并保持默认值一致
[#2215]优化处理传奇交易超时
[#1688]减少客户端不必要的依赖
[#2134]分离不同的交易模式处理逻辑
[#2171]优囮脚本并添加脚本用法演示
[#2182]优化配置项前缀判断
[#2095]重构数据源的自动代理
[#2178]传奇状态机设计器为catch节点添加默认属性
[#2170]增强对通用座位的测试覆盖率
[#2097]使用序列化程序包名称代替编解码器
感谢这些贡献者的代码提交请报告意外疏漏。
}