为什么我不能对全局二级索引进行一致的读取?
我有以下设置:
表:tblUsers (id作为散列)
全局辅助索引:tblUsersEmailIndex (电子邮件作为散列,id作为属性)
全局辅助索引:tblUsersUsernameIndex (用户名作为散列,id作为属性)
我查询索引以检查给定的电子邮件或用户名是否存在,因此我不会创建一个重复的用户。
现在,问题是我不能对索引上的查询进行一致的读取。但为什么不呢?这是我需要最新数据的少数场合之一。
根据AWS文件:
对全局辅助索引的查询只支持最终的一致性。 在正常情况下,对表数据的更改将在一秒钟内传播到全局辅助索引。然而,在一些不太可能的故障场景中,可能会出现更长的传播延迟。因此,您的应用程序需要预测和处理全局辅助索引上的查询返回不是最新的的结果的情况。
但我该如何处理这种情况呢?如何确保给定的电子邮件或用户名不存在于数据库中?
发布于 2016-02-15 20:20:18
您可能已经经历了这样的过程:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html
简单地说,你不能做你想做的对全局辅助指数(即它永远是最终的一致性)。
这里的一个解决方案是有一个单独的表w/您感兴趣的属性作为键,并在那里进行一致的读取。您需要确保每次插入新实体时都要进行更新,还必须考虑插入成功的边缘情况,而不是主表(即需要确保它们是同步的)。
另一种解决方案是扫描整个表,但如果表很大,这可能会造成太大的损失。
为什么你在乎有人用同样的电子邮件创建两个帐户?您可以使用用户名作为主散列键,而不是强制执行电子邮件唯一性。
发布于 2019-11-25 02:36:16
当您尝试使用putItem时,您可以使用一个ConditionExpression来检查是否满足放置该项的条件,这意味着您可以检查email或username是否存在。
ConditionExpression — (String)
A condition that must be satisfied in order for a conditional PutItem operation to succeed.
An expression can contain any of the following:
Functions: attribute_exists | attribute_not_exists | attribute_type | contains | begins_with | size
These function names are case-sensitive.
Comparison operators: = | <> | < | > | <= | >= | BETWEEN | IN
Logical operators: AND | OR | NOT
For more information on condition expressions, see Condition Expressions in the Amazon DynamoDB Developer Guide.https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#putItem-property
发布于 2021-04-02 17:38:58
我最近遇到了这个问题,想分享一下最新的情况。2018年,DynamoDB增加了交易。如果您确实需要保持两个项(无论是在相同的表中还是在不同的表中)保持100%的同步,而最终不需要担心一致性,那么TransactWriteItems和TransactGetItems就是您所需要的。
如果可以的话,最好完全避免交易,就像其他人建议的那样。
https://stackoverflow.com/questions/35414372
复制相似问题