使用祖先在 GAE 上强制与对象化的强一致性
Force strong consistency with objectify on GAE using ancestors
据我了解,使用 objectify 查询的具有祖先的对象应该具有很强的一致性,这意味着我应该始终获得最新的对象,对吗?
好像不是这样。
这是从数据存储中提取数据的示例:
Key<Rule> k = Key.create(Key.create(NinjaAccount.class, accountId), Rule.class, ruleId);
return ofy().consistency(Consistency.STRONG).load().key(k).now();
或查询多个实体:
return ofy().consistency(Consistency.STRONG).load().type(Rule.class).ancestor(Key.create(NinjaAccount.class, accountId))
.list();
但是,当我更新 Rule
对象的其中一个字段时,我可以连续多次 运行 这段代码,并让它在新值和旧值之间来回切换价值。我究竟做错了什么??我几乎准备好切换到 mysql,但我希望有一些我误解的小事。
您发布的代码没有任何问题。此外, consistency(Consistency.STRONG) 调用是不必要的;默认情况下,按键获取和祖先查询是高度一致的。
问题不是最终一致性。
您是否在使用旧版本的 Objectify 并且是否忽略了安装 ObjectifyFilter?从历史上看,这是最有可能的问题(在常见问题解答中)。但是,如果您没有安装过滤器,最新版本的 Objectify 会抛出异常,所以如果您是最新版本,那就是别的东西了。
据我了解,使用 objectify 查询的具有祖先的对象应该具有很强的一致性,这意味着我应该始终获得最新的对象,对吗?
好像不是这样。
这是从数据存储中提取数据的示例:
Key<Rule> k = Key.create(Key.create(NinjaAccount.class, accountId), Rule.class, ruleId);
return ofy().consistency(Consistency.STRONG).load().key(k).now();
或查询多个实体:
return ofy().consistency(Consistency.STRONG).load().type(Rule.class).ancestor(Key.create(NinjaAccount.class, accountId))
.list();
但是,当我更新 Rule
对象的其中一个字段时,我可以连续多次 运行 这段代码,并让它在新值和旧值之间来回切换价值。我究竟做错了什么??我几乎准备好切换到 mysql,但我希望有一些我误解的小事。
您发布的代码没有任何问题。此外, consistency(Consistency.STRONG) 调用是不必要的;默认情况下,按键获取和祖先查询是高度一致的。
问题不是最终一致性。
您是否在使用旧版本的 Objectify 并且是否忽略了安装 ObjectifyFilter?从历史上看,这是最有可能的问题(在常见问题解答中)。但是,如果您没有安装过滤器,最新版本的 Objectify 会抛出异常,所以如果您是最新版本,那就是别的东西了。