2012-03-20 38 views
2

我有一个关于客观化的快速问题 - 这可能是在实际文档中,但我没有找到任何东西,所以我在这里要求安全。做嵌套对象化交易仍然原子 - 或者他们工作

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

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

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

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

+0

谢谢 - 这绝对是很好的知道,即使它有点不幸 – 2012-03-20 02:51:42

+0

是的 - 这绝对是一个挑战;)祝你好运! – 2012-03-20 13:36:57

0

如果他删除内部事务将外部事务仍然无能为力?