0

我正在Google AppEngine上编写同步服务,但某些事情对我来说并不真正起作用。我想要做的是同步一个实体项目(也许它需要被持续,也许只是复制内容,谁知道),然后搜索一个项目类型的实体(可能与第一个项目一样,但没有' t需要)然后用它来同步任务。 所有这些都需要在事务中发生,所以如果任务同步失败,该项目也会被删除。AppEngine:无法从事务中的数据存储中读取持久数据

我写了一些代码行来简单地测试和显示出了什么问题。 此代码完美工作,并向我展示“找到项目”。

User user = userDao.findAll().get(0); 

    // Create a setup service... 
    Project project = new Project(); 
    project.setName("TEST ABC"); 
    project.setLastUpdated(new Date()); 
    project.setUser(user); 
    projectDao.persist(project); 

    Project persistedProject = projectDao.find("TEST ABC", user); 

    if (persistedProject == null) { 
     System.out.println("Project not found..."); 
    } else { 
     System.out.println("Project found!"); 
    } 

所以在这里我不使用交易。但是,当我执行与交易的代码:

User user = userDao.findAll().get(0); 

    Transaction tx = datastores.get().beginTransaction(); 

    // Create a setup service... 
    Project project = new Project(); 
    project.setName("TEST ABC"); 
    project.setLastUpdated(new Date()); 
    project.setUser(user); 
    projectDao.persist(project); 

    Project persistedProject = projectDao.find("TEST ABC", user); 

    if (persistedProject == null) { 
     System.out.println("Project not found..."); 
     tx.rollback(); 
    } else { 
     System.out.println("Project found!"); 
     tx.commit(); 
    } 

我总是看到“项目未找到...”。那么,我到底能够读到一个我刚刚坚持下来的对象,但还没有犯下呢?

顺便说一句:我使用树枝坚持2.0 RC1和最新的AE SDK(1.7)。

所以我的问题是我怎样才能读取持续在同一交易中的数据..?

回答

0

你不行。您应该重新阅读GAE交易文档。

简而言之:事务内部的所有内容都可以获得数据存储的“快照”的一致视图,因此新查询不会显示在查询中。

但是,您拥有您坚持的项目对象,因此您应该使用该对象而不是查询其中的一个。

如果您需要执行查询,则需要手动将它与您在事务中创建的实体“加入”。

+0

据我所知,我正在处理数据存储的快照,并且在另一个事务中添加的内容不会显示在我的结果中。但它是有道理的,增加我在我的交易中做的查询能够在我自己的交易中... 手动加入,你的意思是创建一些缓存系统,当我做一个查询,我手动扫描我的现金列表if任何对象符合?或者你的意思是别的? – dirkvranckaert

+0

不,作为文档状态,哪个dragonx链接到上面,这不是快照隔离的工作方式。真正的问题是,为什么你想在一次交易中做到这一点? –

+0

通过手动“加入”我的意思是你可以搜索你的结果查询列表,但首先手动添加新创建的实体。 – dragonx