AppEngine Objectify:它如何处理对象合并?

时间:2014-07-29 15:42:57

标签: google-app-engine merge objectify

我读到objectify可以处理来自不同客户端的多个请求。在事务期间,如果第二个客户端尝试更新同一对象,则会抛出异常。

如果抛出此类异常,他们建议再次发送请求。

class ClassX {
    public String a;
    public String b;
}

但是如果: 用户1在用户2尝试更新ObjectX.b?

的同时更新ObjectX.a

objectify合并这些变化吗?或者是最后一次更新"一个"?

2 个答案:

答案 0 :(得分:2)

理解乐观并发和版本控制会很有帮助;从这开始:

https://code.google.com/p/objectify-appengine/wiki/Concepts#Transactions

假设您有两个同时运行的交易,"设置值a"和"设定值b"。第一次运行时,第一次提交将成功,第二次提交将失败。 Objectify将重试第二笔交易,该交易将成功。乐观并发为您提供了一系列序列化事务。

这意味着您必须小心如何构建事务 - 它们必须是幂等的。 "将5添加到b"不是幂等交易;如果它运行多次(并且可能;即使成功,数据存储区也可能产生ConcurrentModificationException),您将得到错误的值。 "将b设置为5"是一种幂等交易。

答案 1 :(得分:0)

我现在使用的解决方案:

我在对象中存储一个唯一的ID,该ID在线存储。此ID不是Objectidentifier。

如果用户尝试更改在线对象,我首先要确保他发送的ID及其更改的ID与在线存储的ID相同。 如果它们相同,我将更新推送到在线对象并创建一个新ID(即UUID)。这可以确保当另一个用户尝试更新对象时,他必须拥有新对象UUID,以便能够更新在线对象。