最新ここドキュメントhttp://code.google.com/appengine/docs/java/datastore/transactions.html状態: 「トランザクションを提出する際にアプリが例外を受け取った場合、それは常にトランザクションが失敗したことを意味するものではありませんあなたが例にDatastoreTimeoutExceptionあり、ConcurrentModificationException、またはDatastoreFailureException例外を受け取ることができます。トランザクションがコミットされ、最終的には正常に適用されます。可能であれば、Datastoreトランザクションを偶発的にして、トランザクションを繰り返すと最終結果が同じになるようにしてください。トランザクションとConcurrentModificationExceptionがドキュメントの曖昧
- トランザクションが成功したかどうかをどのように知ることができますか?
- ConcurrentModificationExceptionを捕まえた後、私は何をするつもりですか?再試行する必要があるかどうかはどのようにわかりますか?
- 成功したかどうかわからなくても、たとえば、支払い取引を偶発的にすることをお勧めしますか?
これは、トランザクションが巧妙に成功した場合に役立ちません。別の問題があります。ロールバックされているかどうかはわかりません。 rollback()のドキュメントは次のように言っています: "例外:java.lang.IllegalStateException - トランザクションがすでに**コミット**されている、ロールバックされている、コミットまたはロールバックが進行中(非同期コールを介して)コミットするかロールバックするのは既に失敗しています。 "最終的に、{}ロールバックは実際に成功したために失敗する可能性があります。成功について知る唯一の方法は、トランザクションが成功したという確認としてrollback()の後にIllegalStateExceptionをキャッチすることです。それ以外の場合は再起動する –
ピーターの答えは技術的に正しいです。 APIを正しく理解していることを確認したいだけです。なぜなら、もし私がそうしてしまうと、公式の文書に潜在的なバグがあるのです。なぜなら、rollback()でスローされたIllegalStateException(ISE)を無視し、誤ったログエラーが多く発生する可能性があるからです。また、誰かがISEを捕まえて何もしないと、誤ってループを繰り返すことになり、エラーがさらに悪化する可能性があります。 –