2012-05-04 16 views
0

トランザクション中でなくてもデータストアから削除されるエンティティ(JDO deletePersistentを使用しています)を完全に説明しているドキュメントが見つかりません。パフォーマンスを向上させ、競合を避けるために、トランザクションを使用しない場合、パラレル更新中にデータの精度を失う可能性があります。datastore:トランザクション外のエンティティを削除する

しかし、どのように私のコードは削除操作が別のマシン上でそのエンティティに前回のリードにを置く/後で更新によって上書きされないことと同時に、異なるマシン上で実行されているときに私が確認することができますPersistenceManagerが、添付されたオブジェクトに対する暗黙的な更新を世話するようにしています。

EDIT: deletePersistentの後にそのエンティティを更新しようとすると例外が発生しますが、これはdeletePersistentに渡されたのとまったく同じコピーを更新しようとするときです。それが別のマシン上の別のコピーであった場合、削除されたエンティティ(有効ではない)を更新するか、またはを挿入または更新してとして処理し、そのエンティティを元に戻します。

+0

私はあなたをよく理解しているかどうかは分かりませんが、エンティティが削除された場合、どのように更新することができますか?もはやそこにはない。 – DaTroop

+0

deletePersistentの後にそのエンティティを更新しようとすると、例外が発生しますが、それはdeletePersistentに渡されたものとまったく同じです。それが別のマシン上の別のコピーであった場合、削除されたエンティティを更新するものとして扱われるため、「それはもう存在しません」 **挿入または更新**すると、そのエンティティを元に戻すことができますか? – blue

+1

IDによってすべてです。正確なコピーであるかどうかは気にしないでください。削除されたエンティティを更新しようとすると、常に例外がスローされます。結局のところ一過性です。データストアはそれについて何も知らない。 – DaTroop

答えて

0

答えは「はい」です。以前に読み込まれたオブジェクトが削除され、削除がコミットされた後に更新がコミットされた後でも、@Nick Johnsonはコメントと挿入が同じであるため返されます。更新のためのオブジェクトを取得した後に20秒のスレッドスリープを使用して、オブジェクトを削除してから戻すことができることをテストしました。

0

これは、GAEのドキュメントから取得されます:

トランザクションは、1つまたは複数のエンティティのデータストア操作のセットで取引

を使用します。 各トランザクションはアトミックであることが保証されています。つまり、 トランザクションは部分的に適用されません。トランザクション内のすべての操作 が適用されるか、またはいずれも適用されません。

あまりにも多くのユーザーが同時にエンティティグループを変更しよう:とき

操作が失敗することがあります。 アプリケーションがリソース制限に達しました。データストアで 内部エラーが発生しました。

トランザクションはアトミックであることが保証されているため、単一の削除操作のようなATOMIC操作は常にトランザクションの内部または外部で機能します。

+0

これは、必ずしも連続した2つのアトミックアクションが発生しないことを意味するわけではありません。削除して – blue

+0

@blueを置く私はあなたが削除を停止し、別の同様のレコードの(作成)を置くことはできないと思います。私は最新ではない情報の望ましくない場合を排除するバージョン管理を使用することをお勧めします。 GAEでそれを使用しましたが、Hibernateでうまく動作します。ここをクリックしてください: "http://gae-java-persistence.blogspot.com/2009/10/optimistic-locking-with-version.html" – DaTroop

+0

フィードバックのためのDaTroopが、私はそのケースをテストしました。なぜ20秒間の汚れた読書が行われた後に20秒間寝るか、私がオブジェクトを削除した20秒間にレコードがデータビューアから取り除かれたが、20秒間経過した後は直ぐに戻ってしまった。 – blue

関連する問題