2

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

我有一个使用 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
  }
}

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

谢谢你

4

2 回答 2

2

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

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

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

于 2012-03-20T02:39:48.567 回答
0

If he removes the inner transaction will the outer transaction still do nothing?

于 2012-08-06T01:20:04.743 回答