GAE竞争条件.get()和.put()

时间:2015-10-17 20:23:31

标签: google-app-engine google-cloud-datastore

我使用以下方法保存数据存储区中的一个字段:

self.user.expiration_date = datetime.datetime.utcnow() + datetime.timedelta(days=31)
self.user.put()

我正在使用Webapp2。保存用户到期日期后,我将用户重定向到一个方法,其中写入以下代码。

user = User.all().filter('email =', self.session.get('email'))

digest = self.session.get('passwd').encode('utf-8', 'ignore')
user = user.filter('passwd =', digest).get()
self.user = user

然而,在此之后,当我检查expiration_date时,它的Null或之前的值。

我该怎么做才能获得正确的价值?

1 个答案:

答案 0 :(得分:1)

您正在NoSQL数据存储中看到最终一致性的影响。这部分解释了什么。 https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.w3kz4fze562t

基本上,在写入实体和查询将看到这些写入之间会有一点延迟。如果您通过其密钥重新获取实体,则可以避免此问题。

如果您可以使用User.all()来电替换User.get_by_id()查询,然后比较user.email == session.get('email') and user.password == digest,那么您可以避免这种情况。