Google app engine 嵌套的objectify事务是否保持原子状态?或者它们是否工作

Google app engine 嵌套的objectify事务是否保持原子状态?或者它们是否工作,google-app-engine,gwt,objectify,Google App Engine,Gwt,Objectify,我有一个关于objectify的快速问题-这可能在实际文档中,但我没有发现任何东西,所以我在这里要求安全 我有一个后端使用objectify,我有点匆忙-我想做的是以下-我有一个由活动组成的活动计划。目前,如果我删除一个事件,我实际上是在编写所有逻辑来删除event plans delete方法中的单个活动 我想知道的是,如果我从EventPlans delete方法调用activitys delete方法(如果它允许我这么做),它是原子的吗 示例(这只是伪代码-不是实际代码-大小写和方法名称可

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

我有一个后端使用objectify,我有点匆忙-我想做的是以下-我有一个由活动组成的活动计划。目前,如果我删除一个事件,我实际上是在编写所有逻辑来删除event plans delete方法中的单个活动

我想知道的是,如果我从EventPlans delete方法调用activitys delete方法(如果它允许我这么做),它是原子的吗

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

这样做安全吗就是现在,,它如此混乱的原因是因为我没有意识到实体组的问题-活动中的某些东西与活动本身不在同一个实体组中-修复此问题后,我将所有逻辑放入事件计划删除中,并且该方法变得无法管理-是否可以将内容分解为更小的部分或它会打破原子性吗


谢谢

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

您的内部事务将以事务方式完成。您的外部事务实际上没有任何作用。每个内部删除都在它自己的事务中-即使第二个活动没有被删除,第一个活动仍然完全有可能被成功删除


如果您的目标是删除一组实体“要么全有要么全无”样式,请研究使用任务队列。您可以删除第一个活动并将任务排队以事务方式删除第二个活动,因此可以保证该活动将被删除并将任务排队,或者两者都不会。然后,在任务中,您可以对第二个执行相同的操作,等等。由于任务失败时会重试,因此您可以控制行为,使其类似于事务。唯一需要注意的是,在处理过程中会出现其他请求的结果,包括部分删除的序列。

如果他删除了内部事务,外部事务是否仍将一事无成?

谢谢-知道这一点肯定很好,即使有点不幸是的-这绝对是一个挑战;)祝你好运
// 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
  }
}