共识协议:两阶段提交
问题
日常我们都有银行转账的经历,一个用户A从银行X的账户上转了100元到用户B银行Y的账户。如果单独分析用户A和用户B在各自银行账户的金额变化,它们就是独立的本地事务,但是由于这个场景是跨多个数据源,所以它是一个分布式事务场景,而分布式事务代表的是全局事务。
![](https://i-blog.csdnimg.cn/blog_migrate/e9551c46538993133b1f6686c3ed72a7.png)
如上图所示,用户A在银行X账户的扣款以及用户B在银行Y账户的存款是一个全局事务,它也符合事务的ACID原则,尤其是要兑现原子性(Atomicity),也就是要么这两个操作全部成功,要么全部失败,没有中间状态。如果把这两个操作视作两个节点,在转账场景中,它们就形成了一个更大范畴的分布式系统(虽然银行X和Y的系统并不相同),而要确保分布式事务的原子性,需要保证:
(1)安全性(Safety),所有节点共进退,要么成功,要么失败;
(2)存活性(Liveness