2012-03-20 8 views
2

これは実際のドキュメントにあるかもしれませんが、何も見つかりませんでしたのでここで安全です。ネストされたオブジェクト化されたトランザクションはアトミックなままですか - または動作しますか?

私は一種のオブジェクト指向を使用しているバックエンドを持っています。私は何をしたいのですか?私は活動で構成されたイベントプランを持っています。現在、私はイベントを削除する場合、私は実際にイベントプラン内の個々のアクティビティを削除するロジックをすべて記述していますdeleteメソッド。

私は、イベントプランの削除メソッドからアクティビティの削除メソッドを呼び出すと(これを行うことができれば)、それは原子ですか?

サンプル(これは単なる擬似コードである - 実際にはない - ケースとメソッドの名前が間違っている可能性があります):

// 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)オブジェクトで並行しています。

お客様の内部取引は取引で完了します。外部トランザクションは実際に何もしません。各内部削除はそれ自身のトランザクション内にあります.2番目のアクティビティが削除されなくても最初のアクティビティが正常に削除されることは完全に可能です。

エンティティのグループをすべて削除するかどうかを決めることが目的の場合は、タスクキューを使用して調べます。最初のアクティビティを削除してタスクをエンキューして2番目のトランザクションを削除することができます。これにより、アクティビティが削除され、タスクがエンキューされるか、またはエンキューされるかが保証されます。タスクでは、2番目のタスクなどで同じことを実行できます。失敗した場合にタスクが再試行されるため、トランザクションのような振る舞いを制御できます。注意すべき唯一の事柄は、処理中に部分的に削除されたシリーズを含む他の要求の結果である。

+0

おかげさま - 少しでも不幸なことがあっても分かることは間違いありません –

+0

ええ、間違いなく挑戦します;)幸運を祈る! –

0

内部トランザクションを削除しても、外部トランザクションは何もしませんか?

関連する問題