携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
两阶段提交协议(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进行实现 缺点:整个分布式事务的执行需要由协调者在多个节点之间去协调,增加了事务的执行时间,性能相对较低,两阶段提交涉及多次节点间的网络通信,通信时间太长,并且由于时间关系,会造成增加资源等待时长,不适用于高并发的场景。