谷歌应用引擎数据存储区上的嵌套交易

时间:2012-08-06 02:02:26

标签: google-app-engine transactions google-cloud-datastore objectify

如果我希望所有删除都执行全有或全无。

  1. 如果没有改变。删除组是否是原子的?
  2. 如果我删除外部交易,会有什么变化吗?
  3. 如果我只删除内部事务,那么group是否为原子?
  4. Ig我用批量删除替换for-cycle并只留下外部事务?
  5. 
        // 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
           }
        }
    
    

1 个答案:

答案 0 :(得分:0)

如果您使用Objectify 3.1,那么所有交易都是XG-transactions,它可以在最多5个不同的实体组上运行,即如果您的活动没有共同的父级(=将它们放在同一个实体组中),那么您可以只删除一次交易中的最多五次。

  1. 不,您正在使用并行事务(一个外部,多个内部)。
  2. 不,外部事务没有执行任何操作,因此它什么都不做。有多个内部事务(循环),每个事务都执行它自己的删除。
  3. 是的,您必须在一个事务中执行所有操作才能使操作成为原子操作。如果删除内部事务,则表明您处于正确的路径中。但是,实体组交易限制仍然适用:交易中触及的所有实体必须属于同一个实体组,或者(因为XG默认启用)最多五个不同的实体组(见上文)。请注意,如果您没有明确地将实体放入实体组(通过设置父级),那么每个实体都会获得它自己的实体组。
  4. 是的,批量删除比循环删除更好(由于效率),但第3点的所有交易规则仍然适用。