0

質問は:ds.put(employee)はトランザクションで発生しますか?または、外部トランザクションは、saveRecord(..)のトランザクションによって消去/オーバーライドされますか?

  1. forループのある時点(たとえばi == 5)で行datastore.put(..)でエラーがスローされると、同じ行で発生した以前のプットはロールバックされますか?
  2. saveRecord(..)で発生するプットについてはどうでしょうか。それらはロールバックされないと思います。
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService()
    トランザクションtxn=datastore.beginTransaction();
    試す {
        for(int i = 0; 1 <10; i ++){
            キーemployeeKey=KeyFactory.createKey( "Employee"、 "Joe");
            エンティティemployee=datastore.get(employeeKey);
            employee.setProperty( "vacationDays"、10);

            datastore.put(employee);

            エンティティemployeeRecord=createRecord( "record"、employeeKey);
            saveRecord(employeeRecord);
        }
    txn.commit();
    } ついに {
        if(txn.isActive()){
            txn.rollback();
        }
    }

    public void saveRecord(Entity entity){
       datastore.beginTransaction();
       試す {
          //ここでいくつかのロジックを実行し、アクティビティを削除してtxnをコミットします
          datastore.put(entity);
       } ついに {
        if(datastore.getCurrentTransaction()。isActive()){
          datastore.getCurrentTransaction()。rollback();
        }
       }
    }

4

1 に答える 1

1

OK、低レベルのDatastoreAPIを使用していると仮定します。getTransaction()は存在しないことに注意してください。私はあなたが意味したと思いますdatastoreService.getCurrentTransaction()

DatastoreService.beginTransaction()beginTransaction()トランザクションを返します。これは、再度呼び出すまで、同じスレッド上の現在のトランザクションと見なされます。beginTransaction()「外部」トランザクション内でループを呼び出すため、「外部」コードが壊れます。ループが終了した後ds.getCurrentTransaction()、同じトランザクションは返されません。また、put()暗黙的に現在のトランザクションを使用します。

したがって、最初に、例に示すように、トランザクションを保存するために外部コードを修正する必要があります。

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. いいえ、もちろん違います。それらは異なるトランザクションの一部です。

于 2012-08-06T20:32:20.847 に答える