一致性
一致性是指数据库中的信息是一致的,不矛盾的。
假如一个表示朋友关系的table有两个字段user_id
和friend_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账号...