我有一个客户端按顺序执行以下两个操作:
与此同时,第二个客户正在运行以下程序:
第二个客户端是否可以将“ABC123”作为“newestKey”,但在尝试加载项目“ABC123”时会收到未找到的错误,因为该项尚未通过数据库传播?< / p>
换句话说,是否保证如果一个客户端对数据库进行两次写操作,那么没有客户端会看到第二次写入,除非它也看到第一次写入?
答案 0 :(得分:2)
DynamoDB,尽管它的名字,并不是基于激发Riak的Dynamo白皮书,所以我不能谈论这部分问题。
使用Riak,由于可用性优先于一致性,因此保证相对较少。由于网络分区发生,客户端总是有可能读取包含密钥“ABC123”的对象(让我们称之为“INDEX123”),但可能无法访问具有“ABC123”的服务器。键/值对。
撇开网络严重受损或服务器出现故障的情况,如果满足以下条件,那么我无法想到客户端可以从“INDEX123”读取密钥“ABC123”的情况找到键/值对“ABC123”:
鉴于这些条件,下面是一个示例,说明服务器故障如何阻止客户端能够找到新的键/值对“ABC123”,但只是暂时的。
此时,客户端将被告知不存在此类数据项但 Riak在收到来自具有副本的服务器的密钥/值对后,将其推送到没有的服务器,以及任何未来的客户端请求都会找到它。
此修复操作称为“读取修复”。 Riak还有一个主动的反熵机制,主动识别丢失/不一致的数据项并进行修复。