当写入不在事务中时,Google App Engine 实体组是否被锁定

Are Google App Engine entity groups locked when writes are not in a transaction

我有一个问答评论应用程序(类似于Whosebug)。这些问题及其相关的答案和评论在逻辑上构成了 App Engine Docs 中定义的实体组的一部分。

我想使用实体 groups/ancestor 路径将我的实体组合在一起,原因有两个:

  1. 通过将问题和答案实体物理存储在一起来提高查询效率
  2. 允许我执行祖先查询,这样我就无需将答案键存储在问题实体(关系)上

我不想要强一致性,因为它最终会导致争用。

A​​pp Engine 是在更新时始终锁定实体组还是仅在事务中完成更新时锁定实体组?换句话说,实体组是强制更新发生在事务中还是只是提供使用事务的选项?

关于您选择基于祖先的方法的第一个原因 - 我认为我从未见过任何关于数据存储中物理位置的承诺 - 我想任何此类约束都会与其高可扩展性发生冲突.我不担心,恕我直言,这种效率优化的收益(如果有的话)可以忽略不计。

您应该知道争用与(强)一致性没有直接关系(一致性实际上归结为查询结果的准确性)。

然而,争用与同时访问同一实体组直接相关,即使是读取操作,而不仅仅是写入 - 参见 。使用祖先只会让情况变得更糟,因为祖先树中的所有实体都在同一个实体组中。

对于您的第二个原因(如果我正确理解您的目标),您不需要将答案键存储到您的问题实体中或使用祖先。如果将问题密钥(或密钥 ID)存储到 Answer 实体中,则可以通过对具有匹配问题 key/ID.

的 Answer 实体进行常规(非祖先)查询来获取问题的答案

实体组 "locking" 仅在事务中可见(不,事务不是强制执行的,但在尝试写入外部事务之前请三思 - 会发生意外覆盖)。但请注意,这种锁定仅在防止写操作冲突时有效,而不是在争用时有效。