在事务重试上对象会话缓存

时间:2014-05-08 16:57:16

标签: java google-app-engine objectify

关于交易和缓存的主题,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的其他线程会更新它。

提前感谢您的任何澄清!

0 个答案:

没有答案