关于交易和缓存的主题,Objectify(v4)文档说:
启动事务会创建一个新的Objectify实例,其中包含一个新的空会话缓存。加载和保存将填充此新实例缓存;因此,修改后的实体将在同一事务中再次加载后显示为已修改
通常,这很好,但任何人都可以在事务重试中澄清此缓存会发生什么?每次重试是否清除会话缓存,或者相同的缓存是否跨越重试直到成功?
举例来说,让我们在Thing
:
Thing thing = new Thing();
thing.setValue(1);
ofy().put().entity(thing).now();
// sometime later...
ofy().transact(new VoidWork() {
public void vrun() {
Thing thing = ofy().load().key(Key.create(thing)).safe();
int val = thing.getValue();
thing.setValue(val+1);
ofy().save().entity(thing);
}
});
在第一次执行时,Objectify将为此事务上下文创建一个新的空会话缓存。然后,thing
将被缓存,val
等于1
。假设提交生成ConcurrentModificationException
,因为另一个线程也在编写更新的thing
。这将导致Objectify重试...
所以,我的问题是:Objectify会使用缓存的thing
(带val == 1
),还是会显式重新加载?如果重新加载,它应该有val == 2
,因为导致我们ConcurrentModificationException
的其他线程会更新它。
提前感谢您的任何澄清!