分布式一致性:两阶段提交

分布式一致性:两阶段提交

一致性

一致性是指数据库中的信息是一致的,不矛盾的。

假如一个表示朋友关系的table有两个字段user_idfriend_id,如果有[1,2],那么必须有[2,1]。但是如果table中没有[2,1],可以认为这个table中的数据是不一致的。

又例如银行系统中用户A给用户B转账10¥,这种情况下,可以肯定A、B的资金总和是不变的。转账过程有两步,第1步是从A的账户中扣除10¥,第2步是在B的账户中增加10¥。如果在第1步后由于系统故障,第2步没有执行。此时A、B的资金总和发生变化,认为出现了不一致。这个用事务可以解决。

分布式一致性

分布式系统的一致性问题总是伴随数据复制而生, 数据复制技术在提高分布式系统的可用性、可靠性和性能的同时,却带来了不一致问题。 理想情况下, 多个副本应该是应用透明的, 从外界看来多副本如同单副本, 而事实上维护一致性非常困难。试想一下, 写入新数据时, 某副本所在的服务器宕机,或者突然发生了网络错误, 此时该如何处理? 是继续重试等待故障消失呢,还是放弃写入故障副本? 若继续重试写入, 则导致系统不可用,影响业务; 而放弃写入则副本数据不同步,产生了差异, 会不会对应用会造成影响? 这似乎是个两难问题, 看似无法抉择。 幸好一致性问题并不是非黑即白的二选一问题, 业界早就定义了多套适合于各种应用场景的一致性模型:强一致性、弱一致性、最终一致性。

这里说一下两阶段提交协议。

例如现在数据库A、B、C分别部署在3台主机上,这三个数据库要保持数据的一致性。

两阶段提交协议分为准备和提交两个阶段。

例如现在A要执行一个事务了,它先问问B和C能否执行该事务,而B和C先把这个事务执行一下看行不行。这是第一阶段。

如果B和C都可以执行该事务,那么A、B、C均提交该事务。如果B或者C告知A无法执行该事务,则回滚。这是第二阶段。


另外还有一个三阶段提交,见下面的资料。

资料

两阶段提交协议
分布式一致性
维基百科-二阶段提交
维基百科-三阶段提交
Three-phase commit protocol
Two-phase commit protocol

分布式事务设计-两段式提交
分布式事务设计-三段式提交

《改变未来的九大算法》 第八章

转载于:https://my.oschina.net/letiantian/blog/524843

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109269.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号