什么是二阶段提交?
先举个简单的例子来说明:
小白程序猿训练营组织周末爬山的活动,组织者是Jim。
第一阶段,Jim作为“协调组织者”,给小白和小明(参与者)发微信,组织他们俩明天8点在学校门口集合,一起去爬山,然后开始等待小白和小明答复。
第二阶段,如果小白和小明都回答没问题,那么大家如约而至。如果小白或者小明其中一人回答说“明天没空,不行”,那么Jim会立即通知小白和小明“爬山活动取消”。
二阶段提交(Two-phase Commit)
在计算机网络以及数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm)。通常,二阶段提交也被称为是一种协议(Protocol))。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情况决定各参与者是否要提交操作还是中止操作。
所谓的两个阶段是指:
第一阶段:准备阶段(投票阶段)
第二阶段:提交阶段(执行阶段)
1.准备阶段
事务协调者(事务管理器)给每个参与者(资源管理器)发送Prepare消息,每个参与者要么直接返回失败,要么在本地执行事务,写本地的redo和undo日志,但不提交,到达一种"万事俱备,只欠东风"的状态。
可以进一步将准备阶段分为以下三个步骤:
1、 协调者节点向所有参与者节点询问是否可以执行提交操作(vote),并开始等待各参与者节点的响应。
2、参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。(注意:若成功这里其实每个参与者已经执行了事务操作)。
3、各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个"同意"消息;如果参与者节点的事务操作实际执行失败,则它返回一个"中止"消息。
2.提交阶段
如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息。
参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。(注意:必须在最后阶段释放锁资源)
场景举例
某个P2P平台为吸引用户充值存款,推出充值送积分的活动(积分满一定额度可以抵扣充值款)。那么这个场景中就会涉及到两个数据库:资金数据库和积分数据库。利用两阶段的算法来解决这个分布式问题的图示如下:
最后别忘了关注我们的微信公众号!谢谢*o*!