写点什么

分布式事务 - 两阶段提交协议(2PC)

作者:zarmnosaj
  • 2022-10-24
    四川
  • 本文字数:769 字

    阅读完需:约 3 分钟

两阶段提交协议(2PC)由来

两阶段提交协议(2PC)的出现,是为了解决分布式系统的数据一致性问题,两阶段提交协议(2PC)方案中包含 协调者和参与者两个角色,一共经过两个阶段和三个操作,部分关系数据库例如 Oracle、MySQL 都支持两阶段提交协议。

两阶段提交协议(2PC)说明

第一阶段:

准备阶段(prepare):当协调者收到事务请求,协调者通知参与者,参与者开始在本机执行事务,但不进行 commit,执行成功返回 yes,执行不成功返回 no,协调者收集参与者的 yes 或者 no 投票。以下单减库存的场景举例:事务协调器向两个服务发起 prepare 消息,两个服务收到消息后分别执行本地事务,并且记录日志,但不进行提交,如果执行成功则回复 yes,否则回复 no。


graph TD协调者  --> 参与者 --> 协调者
复制代码

第二阶段:

提交(commit)/回滚(rollback)阶段:当协调者收到的所有消息都为 yes 时,分别给所有参与者发送 commit 消息,参与者收到 commit 消息后都在本地执行事务的 commit 操作;如果协调者收到的消息存在 no,则给所有参与者发送 abort 消息,参与者收到消息后在本地执行 rollback 操作。以下单减库存的场景举例:事务协调器收到所有参与者的回复,只要有一方回复 no 则向所有参与者发起回滚事务,参与者收到消息后开始回滚事务;如果事务协调器收到回复全部是 yes,此时向参与者发起提交事务。如果参与者有一方提交事务失败则由事务协调器发起回滚事务。


graph TD协调者 -->  参与者
复制代码

总结

协调者和参与者把发送或者接收的消息都写入日志中,如果从宕机中恢复后,可以根据日志恢复。优点:保证强一致性,部分关系数据库支持。可以使用开源软件 atomikos 进行实现 缺点:整个分布式事务的执行需要由协调者在多个节点之间去协调,增加了事务的执行时间,性能相对较低,两阶段提交涉及多次节点间的网络通信,通信时间太长,并且由于时间关系,会造成增加资源等待时长,不适用于高并发的场景。

发布于: 刚刚阅读数: 4
用户头像

zarmnosaj

关注

靡不有初,鲜克有终 2020-02-06 加入

成都后端

评论

发布
暂无评论
分布式事务-两阶段提交协议(2PC)_10月月更_zarmnosaj_InfoQ写作社区