GAE 竞争条件 .get() 和 .put()
GAE Race condition .get() and .put()
我正在使用以下方法保存数据存储中的字段之一:
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 或以前的值。
我应该怎么做才能得到正确的值?
您正在看到 NoSQL 数据存储中最终一致性的影响。本节解释发生了什么。 https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.w3kz4fze562t
基本上,写入实体与查询看到这些写入之间存在轻微延迟。如果通过键重新获取实体,就可以避免这个问题。
如果您可以用 User.get_by_id()
调用替换 User.all()
查询,然后比较 user.email == session.get('email') and user.password == digest
那么您就可以避免它。
我正在使用以下方法保存数据存储中的字段之一:
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 或以前的值。
我应该怎么做才能得到正确的值?
您正在看到 NoSQL 数据存储中最终一致性的影响。本节解释发生了什么。 https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.w3kz4fze562t
基本上,写入实体与查询看到这些写入之间存在轻微延迟。如果通过键重新获取实体,就可以避免这个问题。
如果您可以用 User.get_by_id()
调用替换 User.all()
查询,然后比较 user.email == session.get('email') and user.password == digest
那么您就可以避免它。