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
  }
}

これは安全ですか?- 現在のように、それが非常に混乱している理由は、エンティティ グループの問題に気付いていなかったからです - アクティビティ自体と同じエンティティ グループにない特定のものがアクティビティにありました - これを修正した後、私はすべてを入れましたイベントプランの削除のロジックとメソッドが管理不能になりつつあります-物事をより小さな断片に分割しても大丈夫ですか、それともアトミック性を壊しますか.

ありがとうございました

4

2 に答える 2

2

ネストされたトランザクションは、単一のアトミック チャンクでは発生しません。ネストされたトランザクションのようなものは実際にはありません。例のトランザクションはすべて並列であり、異なる Objectify (DatastoreService) オブジェクトがあります。

内部トランザクションはトランザクション的に完了します。外部トランザクションは実際には何もしません。内部削除はそれぞれ独自のトランザクション内にあります。2 番目のアクティビティが削除されなくても、最初のアクティビティが正常に削除される可能性は十分にあります。

目標がエンティティのグループをオール オア ナッシング スタイルで削除することである場合は、タスク キューの使用を検討してください。最初のアクティビティを削除し、タスクをキューに入れて 2 番目のアクティビティをトランザクション的に削除することができます。そのため、アクティビティが削除されてタスクがキューに入れられるか、またはそのどちらでもないことを保証できます。次に、タスクで、2 番目のタスクなどで同じことを行うことができます。タスクは失敗すると再試行されるため、動作をトランザクションのように制御できます。注意すべきことは、処理中に一部削除されたシリーズを含む他のリクエストが発生することです。

于 2012-03-20T02:39:48.567 に答える
0

彼が内部トランザクションを削除した場合、外部トランザクションはまだ何もしませんか?

于 2012-08-06T01:20:04.743 に答える