目录
- 2PC
- 解释
- 例子
- 分析
- 回到IT系统中
- XA 方案
- 执行流程
- DTP 模型
- 交互模式
- 总结
2PC
解释
- 2PC 即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),
- 2 是指两个阶段,P 是指准备阶段,C 是指提交阶段。
例子
- 张三和李四好久不见,老友约起聚餐,饭店老板要求先买单,才能出票。
- 这时张三和李四分别抱怨近况不如意,囊中羞涩,都不愿意请客,这时只能AA。
- 只有张三和李四都付款,老板才能出票安排就餐。
- 但由于张三和李四都是铁公鸡,形成了尴尬的一幕:
分析
-
准备阶段:老板要求张三付款,张三付款。老板要求李四付款,李四付款。
-
提交阶段:老板出票,两人拿票纷纷落座就餐。
-
例子中形成了一个事务,若张三或李四其中一人拒绝付款,或钱不够,店老板都不会给出票,并且会把已收款退回。
-
整个事务过程由事务管理器和参与者组成,店老板就是事务管理器,张三、李四就是事务参与者,事务管理器负责决策整个分布式事务的提交和回滚,事务参与者负责自己本地事务的提交和回滚。
回到IT系统中
-
在计算机中部分关系数据库如 Oracle、MySQL 支持两阶段提交协议,如下图:
- 准备阶段(Prepare phase):
- 事务管理器给每个参与者发送 Prepare 消息,每个数据库参与者在本地执行事务,并写本地的 Undo/Redo 日志,此时事务没有提交。
- Undo 日志是记录修改前的数据,用于数据库回滚,Redo 日志是记录修改后的数据,用于提交事务后写入数据文件
- 提交阶段(commit phase):
- 如果事务管理器收到了参与者的执行失败或者超时消息时,直接给每个参与者发送回滚(Rollback)消息;
- 否则,发送提交(Commit)消息;
- 参与者根据事务管理器的指令执行提交或者回滚操作,并释放事务处理过程中使用的锁资源。
- 注意:必须在最后阶段释放锁资源。
- 准备阶段(Prepare phase):
XA 方案
- 2PC的传统方案是在数据库层面实现的,如 Oracle、MySQL 都支持 2PC 协议
- 为了统一标准减少行业内不必要的对接成本,需要制定标准化的处理模型及接口标准,国际开放标准组织 Open Group 定义了分布式事务处理模型DTP(Distributed Transaction Processing Reference Model)。
- 以新用户注册送积分为例来说明
执行流程
- 应用程序(AP)持有用户库和积分库两个数据源。
- 应用程序(AP)通过 TM 通知用户库 RM 新增用户,同时通知积分库RM为该用户新增积分,RM 此时并未提交事务,此时用户和积分资源锁定。
- TM 收到执行回复,只要有一方失败则分别向其他 RM 发起回滚事务,回滚完毕,资源锁释放。
- TM 收到执行回复,全部成功,此时向所有 RM 发起提交事务,提交完毕,资源锁释放。
DTP 模型
-
DTP 模型定义如下角色
- AP(Application Program):即应用程序,可以理解为使用 DTP 分布式事务的程序。
- RM(Resource Manager):即资源管理器,可以理解为事务的参与者,一般情况下是指一个数据库实例,通过资源管理器对该数据库进行控制,资源管理器控制着分支事务。
- TM(Transaction Manager):事务管理器,负责协调和管理事务,事务管理器控制着全局事务,管理事务生命周期,并协调各个 RM。
-
全局事务是指分布式事务处理环境中,需要操作多个数据库共同完成一个工作,这个工作即是一个全局事务。
-
DTP 模型定义TM和RM之间通讯的接口规范叫 XA,简单理解为数据库提供的 2PC 接口协议,基于数据库的 XA 协议来实现 2PC 又称为 XA 方案
交互模式
以上三个角色之间的交互方式如下:
- TM 向 AP 提供 应用程序编程接口
- AP 通过 TM 提交及回滚事务。
- TM 交易中间件通过 XA 接口来通知 RM 数据库事务的开始、结束以及提交、回滚等。
总结
整个 2PC 的事务流程涉及到三个角色 AP、RM、TM。
- AP 指的是使用 2PC 分布式事务的应用程序;
- RM 指的是资源管理器,它控制着分支事务;TM 指的是事务管理器,它控制着整个全局事务。
- 在准备阶段 RM 执行实际的业务操作,但不提交事务,资源锁定
- 在提交阶段 TM 会接受 RM 在准备阶段的执行回复,只要有任一个RM执行失败,TM 会通知所有 RM 执行回滚操作,否则,TM 将会通知所有 RM 提交该事务。提交阶段结束资源锁释放。
XA方案的问题:需要本地数据库支持XA协议。 资源锁需要等到两个阶段结束才释放,性能较差。