我有一个名为SignupTokens的模型,我们正在使用isUsed = True更新实体,当用户从我们的聊天机器人确认他们时,更新实体后如果我们查询未使用的令牌用于特定相同的电子邮件isUsed = False然后一些时间结果甚至返回isUsed标志已经更新为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)
请让我知道任何人都有这个想法。
这很可能不是一个ndb缓存问题,它是由于eventual consistency引起的预期数据存储行为:从实体的isUsed
属性设置为True
到相应地更新对应于您的查询的索引需要一些时间。
在索引更新之前,查询结果不会反映更改。
正如@Dan所说,这很可能不是ndb
缓存问题。这是您在连续读写同一实体组时引起的问题。这是一个数据存储行为,主要是由于datastore contention和eventual consistency引起的。
有一些方法可以避免这种情况。
key
查询。每当你试图通过它的键读取一个对象时,它就是strongly consistent
。因此,在您的情况下,我建议存储您正在更新的对象的密钥,如果可能,然后阅读它并执行您想要的操作。希望这能回答你的问题!!!