理论
ACID
-
Atomicity(原子性):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复到事务开始前的状态,就像这个事务从来没有执行过一样。
-
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。完整性包括外键约束、应用定义的等约束不会被破坏。
-
Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
-
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
BASE
-
基本业务可用性(Basic Availability)
-
柔性状态(Soft state)
-
最终一致性(Eventual consistency)
分布式事务也部分遵循 ACID 规范
-
原子性:严格遵循
-
一致性:事务完成后的一致性严格遵循;事务中的一致性可适当放宽
-
隔离性:并行事务间不可影响;事务中间结果可见性允许安全放宽
-
持久性:严格遵循
分布式事务模型
分布式事务的 X/Open 标准定义了分布式事务处理的模型。在此模型中,协调事务管理器管理每个数据源如何根据参与事务的所有数据源的知识处理事务。通常,管理自己的事务落实与恢复的数据源会将此任务委托给事务管理器。
根据 X/Open 标准,分布式事务处理模型包含以下组件:
- 一个应用程序(AP),用于定义事务边界并指定构成事务的操作
- 资源管理器(RM),如数据库或文件系统,用于提供对共享数据源的访问权
- 一个事务管理器(TM),用于为事务分配标识,监控事务进度,并管理事务完成和失败恢复
XA
流程
XA一共分为两阶段:
- 第一阶段(prepare):即所有的参与者RM准备执行事务并锁住需要的资源。参与者ready时,向TM报告已准备就绪。
- 第二阶段 (commit/rollback):当事务管理者™确认所有参与者(RM)都ready后,向所有参与者发送commit命令。
如果有任何一个参与者prepare失败,那么TM会通知所有完成prepare的参与者进行回滚。
目前主流的数据库基本都支持XA事务,包括mysql、oracle、sqlserver、postgre
XA 事务由一个或多个资源管理器(RM)、一个事务管理器(TM)和一个应用程序(ApplicationProgram)组成。
优点
简单易理解,开发较容易
缺点
对资源进行了长时间的锁定,并发度低
对支持事务的数据库友好;不支持事务数据库需要自己实现回滚逻辑
AT
流程
两阶段提交协议的演变:
-
一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
-
二阶段:
- 提交异步化,非常快速地完成。
- 回滚通过一阶段的回滚日志进行反向补偿。
缺点
仅支持本地 ACID 事务 的 关系型数据库
SAGA
Saga模式是SEATA提供的长事务解决方案
在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。
优势
- 一阶段提交本地事务,无锁,高性能
- 事件驱动架构,参与者可异步执行,高吞吐
- 补偿服务易于实现
缺点
需要业务方维护编写两个接口,执行和补偿
TCC
适用场景
- 业务流程长、业务流程多
- 参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口
流程
- 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
- 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
- 二阶段 cancel 行为:调用 自定义 的 rollback 逻辑。
优势
- 一阶段提交本地事务,无锁,高性能
- 事件驱动架构,参与者可异步执行,高吞吐
- 补偿服务易于实现
缺点
- 不保证隔离性