嵌套的客观化事务仍然是原子的 - 或者它们是否有效

时间:2012-03-20 02:11:30

标签: google-app-engine gwt objectify

我有一个关于客体化的快速问题 - 这可能在实际文档中,但我没有找到任何东西,所以我要求这里安全。

我有一个使用客观化的后端,我有点冲出来 - 我想做的是以下 - 我有一个由活动组成的活动计划。目前,如果我删除了一个事件,我实际上正在编写所有逻辑,删除事件计划删除方法中的个别活动。

我想知道的是,如果我从事件计划删除方法调用活动删除方法(如果它允许我这样做),它是原子的吗?

示例(这只是伪代码 - 不是实际的 - 大小写和方法名称可能有误):

// inside event plan dao
public void delete(EventPlan eventPlan) {
  final Objectify ofy = Objectify.beginTransaction();
  try {
    final ActivityDAO activityDao = new ActivityDAO();
    for (final Activity activity : eventPlan.getActivities()) {
      activityDao.delete(activity);
    }
    ofy.getTxn().commit();
  } finally {
    if (ofy.getTxn().isActive()) {
      ofy.getTxn().rollback();
    |
  }
}


// inside activity dao
public void delete(Activity activity) {
  final Objectify ofy = Objectify.beginTransaction();
  try {
    // do some logic in here, delete activity and commit txn
  } finally {
    // check and rollback as normal
  }
}

这样做安全吗? - 就像现在一样,之所以如此糟糕,是因为我没有意识到实体组的问题 - 活动中有些东西与活动本身不在同一个实体组中 - 修复后我放了所有事件计划删除中的逻辑和方法变得难以管理 - 是否可以将内容分解为更小的部分或者它会破坏原子性。

谢谢

2 个答案:

答案 0 :(得分:2)

嵌套事务不会发生在单个原子块中。实际上没有任何嵌套事务 - 示例中的事务都是并行的,具有不同的Objectify(DatastoreService)对象。

您的内部交易将以交易方式完成。你的外部交易并没有真正做任何事情。每个内部删除都在它自己的事务中 - 即使第二个Activity没有被删除,第一个Activity仍然可以被成功删除。

如果您的目标是删除一组实体全有或全无的风格,请查看使用任务队列。您可以删除第一个活动并将任务排入队列以便以事务方式删除第二个活动,这样可以保证将删除活动并将任务排入队列,或者两者都不排队。然后,在任务中,您可以对第二个等执行相同操作。由于任务在失败时重试,您可以将行为控制为类似事务。唯一需要注意的是其他请求,包括在此过程中部分删除的系列。

答案 1 :(得分:0)

如果他删除内部交易,那么外部交易仍然无效?