【发布时间】:2013-04-18 18:07:19
【问题描述】:
我已经实现了两个服务器端 HTTP 端点,它们 1) 存储一些数据并 2) 处理它。方法 1) 通过 App Engine Tasks 调用方法 2),因为它们是我不希望客户端等待的耗时任务。该过程如下面的序列图所示。
现在我有时会遇到处理任务(在下面的序列图中名为 processSomething)在尝试处理时找不到数据 - 用下面的黄色 throw WtfException() 说明。这可以用最终一致性模型described here来解释吗?
文档说读取的强一致性,但写入的最终一致性。我不确定这与此案有关的确切含义。任何澄清表示赞赏。
编辑:我意识到我在这里问的是一个布尔问题,但我想我正在寻找一个答案,该答案有一些关于最终一致性通常是什么的文档,特别是在 Google Datastore 上
编辑 2: 应要求在此处提供有关实际读/写操作的详细信息:
写操作:
entityManager.persist(hand);
entityManager.close()
我正在使用 JPA 进行数据持久性。对象 'hand' 是从客户端接收的,并且之前没有存储在数据库中,因此将分配一个新键 Id。
读操作:
SELECT p FROM Hand p WHERE p.GameId = :gid AND p.RoundNo = :rno
GameId 和 RoundNo 都不是主键。 GameId 是一个“外键”,尽管 Datastore 在设计上没有注意到这一点。
【问题讨论】:
-
如果你按键加载(id),我认为你应该得到更新的实体。来自文档“因为 Datastore 获取和祖先查询在执行之前应用了任何未完成的修改,所以这些操作始终会看到所有先前成功事务的一致视图。这意味着获取操作(通过其键查找更新的实体)可以保证看到该实体的最新版本。”
标签: database google-app-engine google-cloud-datastore database-replication acid