在同一事务中编写objectify和datastore实体

时间:2017-04-28 08:44:04

标签: google-app-engine google-cloud-datastore objectify

我试图在同一个实体组中编写两个实体,一个通过客观化,另一个通过低级数据存储api。我创建了一个数据存储区事务来执行此操作。我的代码如下所示 -

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

Transaction transaction = datastore.beginTransaction();

try {
  Summary summary = Ofy.ofy().load().key(com.googlecode.objectify.Key.create(parent)).now();
  // Change summary
  Ofy.ofy().save().entity(summary).now();
  Key key = KeyFactory.createKey(parent, "Data", id);

  Entity entity = new Entity(key);
  // add stuff to entity
  datastore.put(entity);
  transaction.commit();
} finally {
  if (transaction.isActive()) {
    transaction.rollback();
  }
}

但是我最近遇到了一些数据不一致,如果此事务不能保证两个实体的事务更新,则可以解释这些数据不一致。我的问题是,交易应该以这种方式运作吗?

根据最后的FAQ条目 - https://github.com/objectify/objectify/wiki/FrequentlyAskedQuestions,我们可以在事务中混合objectify和datastore写入,但代码示例可能使用objectify-transactions。这是唯一的方法吗?

1 个答案:

答案 0 :(得分:0)

我能够在测试中重现场景,事实上我们无法从数据存储区事务中进行客观化更新,但我们可以从客观化事务中进行数据存储更新。

以下作品 -

final DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

Ofy.ofy().transact(new Work<Void>() {
  @Override
  public Void run() {
    Summary summary = Ofy.ofy().load().key(com.googlecode.objectify.Key.create(parent)).now();
    // Change summary
    Ofy.ofy().save().entity(summary).now();
    Key key = KeyFactory.createKey(parent, "Data", id);

    Entity entity = new Entity(key);
    // add stuff to entity
    datastore.put(entity);
    return null;
  }
});