【发布时间】:2015-02-15 05:21:08
【问题描述】:
给定一个简单的 Objectify v5 实体,例如
@Entity
@Cache
public class Thing {
@Id
public String uid;
public int a;
public int b;
}
当我希望以下内容为真时,更新现有实体的正确方法是什么
- 0 数据库操作时更新没有改变。 IE。当没有属性更改时,应该使用缓存并且不会失效。
- 一致性:属性
a和b的独立、并发更新不得将其他属性的更改还原=> 事务
如果没有检测到变化,以下应该可以工作
public static Thing updateA( final String uid, final int value ) {
return ofy().transact(new Work<Thing>() {
@Override
public Thing run() {
Thing thing = ofy().load().type(Thing.class).id(uid).safe();
thing.a = value;
ofy().save().entity(thing);
return thing;
}
});
}
但是,据我所知,由于 Objectify 不会检测到更改,因此上面的代码实际上会覆盖实体、刷新缓存等。这正是我试图阻止的。
如果保存是有条件的
if (thing.a != value) {
thing.a = value;
ofy().save().entity(thing);
} else {
// consistency guarantees w/o save?
// need to transaction rollback / commit?
}
这会按预期工作吗?换句话说,一个只加载一个值但从不保存一个值的事务会发生什么?我对乐观锁定的理解是,事务结束时的某些操作需要验证状态是否符合要求。不保存时感觉就像丢失了一样。
【问题讨论】:
标签: java objectify google-app-engine