【问题标题】:Ancestor query in transaction (objectify) returns data "frozen in time"事务中的祖先查询(objectify)返回“及时冻结”的数据
【发布时间】:2014-10-25 22:23:34
【问题描述】:

直接举例:

@Entity
public class Parentt {
    @Id
    String id;
}

@Entity
public class Child {
    @Parent 
    Ref<Parentt> parenttRef;
    @Id
    String id;
}

public void test() {
final Parentt parentt = new Parentt();
        ofy().transact(new VoidWork() {
            @Override
            public void vrun() {

                parentt.setId(UUID.randomUUID().toString());
                ofy().save().entity(parentt).now();
                Child child = new Child();
                child.setId(UUID.randomUUID().toString());
                child.setParentt(parentt.getId());
                ofy().save().entity(child).now();

                LOG.info("query result size: " + ofy().load().type(Child.class).ancestor(parentt).list().size());
                ofy().flush();
                LOG.info("query result size: " + ofy().load().type(Child.class).ancestor(parentt).list().size());

            }
        });

        LOG.info("query result size(outside of transaction): " + ofy().load().type(Child.class).ancestor(parentt).list().size());
}

test()方法内部代码生成的结果:

query result size: 0

query result size: 0

query result size(outside of transaction): 1

我在 Objectify 文档中找到:

低级 API 有一些怪癖:例如,get()s 和 query()s 将看到数据存储“及时冻结”并且不会反映 甚至在事务中更新。 Objectify 隐藏了这种行为 来自你;随后的提取将看到相同的数据(或更新) 之前。请注意,由于查询总是在 GAE 内部运行, 索引(即过滤操作)似乎总是及时冻结 - Objectify 无法隐藏这一点。

祖先查询是否基于内部索引,这就是查询在事务内部不返回结果的原因(这里除了父查询之外没有其他过滤)?

【问题讨论】:

    标签: java google-cloud-datastore objectify


    【解决方案1】:

    查询本质上是基于索引的——它们通过往返于 GAE 的方式提供服务。因此 GAE 的行为定义了返回值。 Objectify 在这方面确实无能为力。

    【讨论】:

    • “Objectify 对您隐藏此行为”是什么意思。在从 gswierczynski 看到这个测试用例之前,我认为“隐藏”意味着 Objectify 会覆盖这个怪癖。换句话说,当我阅读“Objectify 隐藏此行为”时,我认为 gswierczynski 的测试用例对于所有三个日志语句的输出大小都为 1。那么你能澄清一下“隐藏”是什么意思吗?谢谢!
    • 如果您执行按键获取操作,您将从会话中取出对象 - 因此行为将与低级 API 中的“冻结”描述有所不同。 Objectify 不是查询引擎;它没有对索引的特殊访问权限,因此当您运行查询时,您会得到 GAE 为您提供的信息。但是,如果查询返回该值,您仍然会在会话中取回该对象。
    • 感谢@stickfigure 的解释
    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 2017-11-25
    • 2020-01-14
    • 2012-07-20
    • 1970-01-01
    • 2012-09-13
    • 2016-05-06
    • 1970-01-01
    相关资源
    最近更新 更多