分布式事务- 2pc(two-phase commit)
关于分布式事务的定义
https://en.wikipedia.org/wiki/Distributed_transaction
分布式事务主要是针对分布式服务调用 为了保证 整体的事务原则 (ACID)
对于分布式事务核心算法思想就是 2PC(two-phase commit)
https://en.wikipedia.org/wiki/Two-phase_commit_protocol
关于两阶段提交理论 实际 就是通过一个协调者和多个参与者来实现分布式事务
两阶段(two-phase )
- commit-request(提交请求(投票)阶段)
- 协调者发送一个请求给所有的参与者,并等待直到所有的参与者响应
- 当参与者接收到消息时会开启本地事务,并达到可提交点,本地事务会生成对应的undoLog和redoLog
- 对于每一个成功完成以上操作的参与者会投赞成票;对于操作失败的参与者会投反对票
- commit(提交阶段,包含的操作为提交或回滚操作对于以上投票操作,会存在成功和失败两种情况)
- 成功的情况,协调者获取当前所有参与者的赞成票
- 协调者发送一个允许提交的消息给到所有的参与者
- 当参与者接收到允许提交(commit)的消息后,正式提交本地事务,并释放本地占用的资源以及锁
- 参与者完成提交操作后,会给协调器发送一个操作成功的请求
- 当协调器接收到所有参与者操作成功的回复后,协调器会完成协调器自身的事务
- 失败的情况,存在参与者投反对票或协调者超时(全局事务超时)
- 协调者发送一个需要回滚的请求给到所有的参与者
- 当参与者接收到回滚的请求时,会根据当前参与者本地事务记录的undolog和redoLog执行回滚操作;并释放当前参与者锁定的资源以及相关锁
- 参与者完成回滚操作后,会给协调器发送一个操作成功的请求
- 当协调器接收到所有参与者操作成功的回复后,协调器会回滚当前事务
- 成功的情况,协调者获取当前所有参与者的赞成票
对于两阶段操作的流程描述如下
- 协调器开启本地事务操作,并通知所有的参与者执行投票操作
- 参与者接收到请求后,准备本地事务到准备提交阶段,结果有可能成功或失败,参与者会根据本地事务执行情况进行投票(赞成/反对)操作
- 协调器会根据投票结果进行不同的操作,只有全部的参与者投赞成票才认为是通过(通知允许全部的参与者执行本地事务提交操作);反之则为禁止;根据投票结果会给所有的参与者发送 允许提交(commit)或回滚(rollback)的命令
- 参与者会根据接收到的命令,本地事务执行相关的操作,并将执行结果再次通知给协调器
- 当协调器收到第二阶段所有参与者操作成功的回复后,协调器会根据第二阶段通知参与者的请求执行 协调器本地事务的commit/rollback