2

是否可以强制 GAE 数据存储的强一致性?

我有这个代码:

#!/usr/bin/env python
Import OS, says
import wsgiref.handlers
import webapp2
from google.appengine.ext import db
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import template

class guestbook(db.Model):
  message = db.StringProperty(required=True)
  when = db.DateTimeProperty(auto_now_add=True)
  who = db.StringProperty()

class ShowGuestbookPage(webapp2.RequestHandler):
  def get(self):
    # Read from the Datastore
    shouts = db.GqlQuery('SELECT * FROM guestbook ORDER BY when DESC')
    values = {'shouts': shouts}
    self.response.out.write(template.render('main.html', values))

class MakeGuestbookEntry(webapp2.RequestHandler):
  def post(self):
    shout = guestbook(message=self.request.get('message'), who=self.request.get('who'))
    # Write into the datastore
    shout.put()
    self.redirect('/')

app = webapp2.WSGIApplication([('/', ShowGuestbookPage),
                               ('/make_entry', MakeGuestbookEntry),
                               debug=True)

def main():
  run_wsgi_app(app)

if __name__ == "__main__":
  main()

实现强一致性的最简单方法是什么?

我不明白如何将 Google 的解释 [1] 翻译成源代码。

[1] https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency

谢谢你的帮助。

4

3 回答 3

2

是的,您可以使用实体组。在文档中了解它的优点和缺点。

您还可以定义自己的实体 id 并“按 id”获取它们,这始终保证一致。

于 2013-10-05T16:56:21.670 回答
1

获取、放置和删除操作始终是强一致的。祖先查询也是强一致的。

其余查询不是强一致的,并且没有特殊的配置参数可以使它们强一致。

于 2013-10-06T07:37:14.227 回答
1

为了强制执行强一致性,必须应用两个条件:

  1. db.Model 实体必须具有祖先关系
  2. 并且您的查询必须按祖先过滤

然后将使用强一致性查询所有孩子。

一个很好的解释可以在这里找到

于 2014-12-17T21:44:09.577 回答