在同一事务中编写对象化和数据存储实体
Writing objectify and datastore entities in the same transaction
我正在尝试在同一个实体组中编写两个实体,一个通过对象化,另一个通过低级数据存储 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();
}
}
但是我最近遇到了一些数据不一致的问题,如果此事务不能保证对两个实体进行事务更新,则可以解释这种情况。我的问题是,交易应该以这种方式进行吗?
根据此处的最后一个常见问题解答条目 - https://github.com/objectify/objectify/wiki/FrequentlyAskedQuestions,我们可以在事务中混合对象化和数据存储写入,但代码示例可能使用对象化事务。这是唯一的方法吗?
我能够在测试中重现该场景,确实我们不能从数据存储事务中进行对象化更新,但我们可以从对象化事务中进行数据存储更新。
所以下面的作品 -
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;
}
});
我正在尝试在同一个实体组中编写两个实体,一个通过对象化,另一个通过低级数据存储 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();
}
}
但是我最近遇到了一些数据不一致的问题,如果此事务不能保证对两个实体进行事务更新,则可以解释这种情况。我的问题是,交易应该以这种方式进行吗?
根据此处的最后一个常见问题解答条目 - https://github.com/objectify/objectify/wiki/FrequentlyAskedQuestions,我们可以在事务中混合对象化和数据存储写入,但代码示例可能使用对象化事务。这是唯一的方法吗?
我能够在测试中重现该场景,确实我们不能从数据存储事务中进行对象化更新,但我们可以从对象化事务中进行数据存储更新。
所以下面的作品 -
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;
}
});