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

时间:2012-08-06 14:05:21

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

问题是:ds.put(员工)是否在交易中发生?或者外部事务是否被saveRecord(..)中的事务擦除/覆盖?

  1. 一旦在for循环中的某个点(也就是说i == 5)的行数据中输出了错误(假设i == 5),先前的put会在同一行上进行回滚吗?
  2. 在saveRecord(..)中发生了什么。我想那些不会被回滚。
  3. 
        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService()
        Transaction txn = datastore.beginTransaction();
        try {
            for (int i=0; 1<10; i++) {
                Key employeeKey = KeyFactory.createKey("Employee", "Joe");
                Entity employee = datastore.get(employeeKey);
                employee.setProperty("vacationDays", 10);
    
                datastore.put(employee);
    
                Entity employeeRecord = createRecord("record", employeeKey);
                saveRecord(employeeRecord);
            }
        txn.commit();
        } finally {
            if (txn.isActive()) {
                txn.rollback();
            }
        }
    
        public void saveRecord(Entity entity) {
           datastore.beginTransaction();
           try {
              // do some logic in here, delete activity and commit txn
              datastore.put(entity);
           } finally {
            if (datastore.getCurrentTransaction().isActive()) {
              datastore.getCurrentTransaction().rollback();
            }
           }
        }
    
    

1 个答案:

答案 0 :(得分:1)

好的,我假设你使用的是低级数据存储API。请注意,getTransaction()不存在。我假设你的意思是datastoreService.getCurrentTransaction()

DatastoreService.beginTransaction()将返回一个事务,在您再次调用beginTransaction()之前,该事务被视为同一线程上的当前事务。由于您在“外部”事务中的循环中调用beginTransaction(),它会破坏您的“外部”代码:循环结束后ds.getCurrentTransaction()不会返回相同的事务。此外,put()隐式使用当前事务。

首先,您必须修复外部代码以将事务保存为shown in example

public void put(EventPlan eventPlan) {
  Transaction txn = ds.beginTransaction();
  try {
    for (final Activity activity : eventPlan.getActivities()) {
      save(activity, getPlanKey(eventPlan)); // PUT

      // IMPORTANT - also pass transaction and use it
      // (I assume this is some internal helper method)
      ds.put(txn, activity, getSubPlanKey(eventPlan)); //subplan's parent is eventPlan
    }
    txn.commit();
  } finally {
    if (txn.isActive()) 
      txn.rollback();
  }
}

现在回答问题:

  1. 是的,因为所有看跌期权现在都是同一交易的一部分(在您修改代码之后),如果出现错误,您就会调用txn.rollback()

  2. 不,当然不是。它们是不同交易的一部分。