【问题标题】:GAE High Replication datastore (HRD) with transaction具有事务的 GAE 高复制数据存储 (HRD)
【发布时间】:2012-03-09 21:32:12
【问题描述】:

我使用 HRD 是因为我想使用实体组在单个事务中更改多个实体。

了解非事务性(非祖先)查询可能会看到之前提交的事务的全部、部分或没有结果。

我现在面临的问题是: 提交向数据库添加新记录的事务后

  Transaction tx = pm.currentTransaction();
  tx.begin();
  pm.makePersistent(object);
  tx.commit();
  • 通过查询提交的记录,有时它会返回结果,有时只是返回为空

      Query q = pm.newQuery(queryStatement);        
      CompanyProfile result = (CompanyProfile) q.execute();
    

p/s:当关闭 HRD 时,它可以正常工作。

有什么解决方法吗?

谢谢 Rgds SJ

【问题讨论】:

    标签: java google-app-engine transactions


    【解决方案1】:

    没有办法解决:HRD 始终是最终一致的:http://code.google.com/appengine/docs/python/datastore/queries.html#Setting_the_Read_Policy_and_Datastore_Call_Deadline

    一种解决方法是使用 get 而不是查询。 HRD中get/put/delete强一致,而query最终一致:http://code.google.com/appengine/docs/java/datastore/hr/

    如果这是一个用户会话中保存后立即查询的场景,您可以查询数据并将保存的实体手动添加到列表中。

    【讨论】:

      【解决方案2】:

      如果您想使用关系数据库模型,您可能想看看 Google Cloud SQL:https://developers.google.com/cloud-sql/ 我自己没有尝试过,但我没有在我的应用程序中使用任何事务。

      我绝对不会使用旧的非 HR 数据存储。如果它在未来一两年年底消失,我不会感到惊讶。它远不如 HR 数据存储可靠。但正如您所发现的,如果您不习惯,最终的一致性可能会很棘手。

      【讨论】:

        【解决方案3】:

        如果以下查询也在同一个事务中完成,它应该返回正确的结果。但是,所有其他查询最终都是一致的,不幸的是,这就是数据存储的本质。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-09
          • 1970-01-01
          • 2023-04-02
          • 2013-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多