2012-03-12 13 views
2

最新ここドキュメントhttp://code.google.com/appengine/docs/java/datastore/transactions.html状態: 「トランザクションを提出する際にアプリが例外を受け取った場合、それは常にトランザクションが失敗したことを意味するものではありませんあなたが例にDatastoreTimeoutExceptionあり、ConcurrentModificationException、またはDatastoreFailureException例外を受け取ることができます。トランザクションがコミットされ、最終的には正常に適用されます。可能であれば、Datastoreトランザクションを偶発的にして、トランザクションを繰り返すと最終結果が同じになるようにしてください。トランザクションとConcurrentModificationExceptionがドキュメントの曖昧

  1. トランザクションが成功したかどうかをどのように知ることができますか?
  2. ConcurrentModificationExceptionを捕まえた後、私は何をするつもりですか?再試行する必要があるかどうかはどのようにわかりますか?
  3. 成功したかどうかわからなくても、たとえば、支払い取引を偶発的にすることをお勧めしますか?

答えて

1

ほとんどのノート:

  1. ドキュメントが言うように - トランザクションが適用された場合は、確認することはできません。それが問題の核心です。

  2. すべての例外の場合にのみロールバックします。次の例を参照してください:http://code.google.com/appengine/docs/java/datastore/transactions.html#Isolation_and_Consistency

  3. 偶数にする - つまり、2回呼び出すと意味はありません。支払取引の場合は、「支払取引」エンティティを作成します。トランザクションごとに、支払データを持つ特別なエンティティを作成し、それをデータストアに書き込みます。ここでの鍵は、支払いIDから元のIDを生成することです。ユーザーID、元のアカウント、支払い金額、ターゲットアカウント、日付/時間/分です。そして、トランザクションが繰り返されると、同じIDを持つ支払いトランザクションエンティティが作成され、古いトランザクショントランザクションエンティティが上書きされます。つまり、1つまたは2つのトランザクションが完了した場合でも結果は同じになります。 (ユーザーアカウントの残高は、一連の取引を経て開始金額に加算することで計算されます。これは銀行が実際にAFAIKで実際に行うことです)。

+0

これは、トランザクションが巧妙に成功した場合に役立ちません。別の問題があります。ロールバックされているかどうかはわかりません。 rollback()のドキュメントは次のように言っています: "例外:java.lang.IllegalStateException - トランザクションがすでに**コミット**されている、ロールバックされている、コミットまたはロールバックが進行中(非同期コールを介して)コミットするかロールバックするのは既に失敗しています。 "最終的に、{}ロールバックは実際に成功したために失敗する可能性があります。成功について知る唯一の方法は、トランザクションが成功したという確認としてrollback()の後にIllegalStateExceptionをキャッチすることです。それ以外の場合は再起動する –

+0

ピーターの答えは技術的に正しいです。 APIを正しく理解していることを確認したいだけです。なぜなら、もし私がそうしてしまうと、公式の文書に潜在的なバグがあるのです。なぜなら、rollback()でスローされたIllegalStateException(ISE)を無視し、誤ったログエラーが多く発生する可能性があるからです。また、誰かがISEを捕まえて何もしないと、誤ってループを繰り返すことになり、エラーがさらに悪化する可能性があります。 –

関連する問題