我有一个称为SignupTokens的模型,当用户从我们的聊天机器人确认其身份时,我们将使用isUsed = True更新实体,更新实体后,如果我们使用isUsed = False查询特定同一电子邮件的未使用令牌,则得出一些结果返回,即使有wasUsed标志已经用True更新。每当我们遇到此问题时,我们都会在数据存储实体中进行一次双重检查。
SignupTokens.gql("where isUsed = :1 and email = :2",False,email).get()
我们已经尝试使用use_cache = False
SignupTokens.gql("where isUsed = :1 and email = :2",False,email).get(use_cache=False)
请让我知道有人对此有想法。
答案 0 :(得分:2)
这很可能不是ndb缓存问题,这是由于eventual consistency导致的预期数据存储行为:从实体的isUsed
属性设置为True
开始,这将需要一些时间。直到与您的查询相对应的索引相应地更新。
在索引更新之前,查询结果将不会反映出更改。
答案 1 :(得分:1)
如@Dan所建议,这很可能不是ndb
缓存问题。这是连续读取和写入同一实体组时引起的问题。这是一种数据存储行为,主要是由于 datastore contention 和 eventual consistency
有某些方法可以避免这种情况。
使用key
查询。每当您尝试通过其键读取对象时,它就是strongly consistent
。因此,在您的情况下,建议您尽可能存储要更新的对象的密钥,然后再读取它并执行所需的操作。
另一种方法是使用NDB异步操作。在此处查看相关的 documentation 。
您可以尝试提供可以帮助您的延迟,但是应以足以使对象更新的方式提供延迟。
希望这能回答您的问题!