2017-12-18 282 views
3

我有一个具有属性的现有DynamoDB表说DynamoDB并发写入

 
--------------------------------------------------------- 
hk(hash-key)| rk(range-key)| a1 | a2 | a3 | 
--------------------------------------------------------- 


我有一个现有的DynamoDb客户端,只只A1更新现有记录。我想创建第二个作家(DDB客户端),它也将更新现有的记录,但仅适用于a2和a3。
如果ddb客户端同时尝试更新相同的记录(a1为1,另一个为a2和a3),那么DynamoDb会保证所有a1 a2 a3都更新为正确的值(全部三个新值)?是否使用保存行为UPDATE_SKIP_NULL_ATTRIBUTES足够用于此目的,还是我需要实现某种乐观锁定?如果没有, DDB为此提供了什么?

回答

-1

读到DyanmoDB最终是一致的。 请参阅:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html

DynamoDB支持最终一致和强一致的读取。

最终一致读取

当你从一个DynamoDB表中读取数据,响应可能不会 反映最近完成写操作的结果。 响应可能包含一些陈旧的数据。如果您在短时间后重复阅读 请求,则回复应返回最新的 数据。

强一致性读取

当你请求一个强烈一致的读取,DynamoDB返回与最先进的最新数据 响应,反映了更新从 的是成功的所有先前的写操作。如果存在网络延迟或中断,则可能无法使用强烈一致的 读取。

注意DynamoDB使用最终一致的读取,除非您另行指定 。读操作(如GetItem,Query和Scan)提供了一个ConsistentRead参数 。如果将此参数设置为true,则 DynamoDB在操作期间使用强烈一致的读取。

基本上,你已经指定你阅读时需要强有力的一致性数据。

而这应该可以解决你的问题。通过一致的读取,您应该看到所有三个字段的更新。

请注意,对强一致性读取有定价影响。

+0

我知道吞吐量消耗强烈一致的读取。我只是问是否可以同时用两个不同的作家写同一个记录,或者其中一个会一次成功,最后的记录最终可能是a1 a2 a3或a1 a2 A'3。希望我能解释我的问题。 –

0

如果您碰巧使用Dynamo Java SDK,那么您很幸运,因为SDK只支持Optimistic Locking。我不知道其他SDK是否支持类似的东西 - 我怀疑他们不支持。

乐观锁是为了确保客户端项目 正在更新(或删除)是相同 DynamoDB项目的战略。如果你使用这种策略,那么你的数据库写入是 保护免受其他人的写入覆盖 - 反之亦然 。

+0

谢谢,让我们看看乐观锁定是唯一的方法。 –