分布式事务 - 两阶段提交协议(2PC)
两阶段提交协议(2PC)由来
两阶段提交协议(2PC)的出现,是为了解决分布式系统的数据一致性问题,两阶段提交协议(2PC)方案中包含 协调者和参与者两个角色,一共经过两个阶段和三个操作,部分关系数据库例如 Oracle、MySQL 都支持两阶段提交协议。
两阶段提交协议(2PC)说明
第一阶段:
准备阶段(prepare):当协调者收到事务请求,协调者通知参与者,参与者开始在本机执行事务,但不进行 commit,执行成功返回 yes,执行不成功返回 no,协调者收集参与者的 yes 或者 no 投票。以下单减库存的场景举例:事务协调器向两个服务发起 prepare 消息,两个服务收到消息后分别执行本地事务,并且记录日志,但不进行提交,如果执行成功则回复 yes,否则回复 no。
第二阶段:
提交(commit)/回滚(rollback)阶段:当协调者收到的所有消息都为 yes 时,分别给所有参与者发送 commit 消息,参与者收到 commit 消息后都在本地执行事务的 commit 操作;如果协调者收到的消息存在 no,则给所有参与者发送 abort 消息,参与者收到消息后在本地执行 rollback 操作。以下单减库存的场景举例:事务协调器收到所有参与者的回复,只要有一方回复 no 则向所有参与者发起回滚事务,参与者收到消息后开始回滚事务;如果事务协调器收到回复全部是 yes,此时向参与者发起提交事务。如果参与者有一方提交事务失败则由事务协调器发起回滚事务。
总结
协调者和参与者把发送或者接收的消息都写入日志中,如果从宕机中恢复后,可以根据日志恢复。优点:保证强一致性,部分关系数据库支持。可以使用开源软件 atomikos 进行实现 缺点:整个分布式事务的执行需要由协调者在多个节点之间去协调,增加了事务的执行时间,性能相对较低,两阶段提交涉及多次节点间的网络通信,通信时间太长,并且由于时间关系,会造成增加资源等待时长,不适用于高并发的场景。
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/6f70ca12a52e91d9c1d39ae96】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论