0

トランザクションに参加せずにエンティティがデータストアから削除されることを完全に説明しているドキュメントを見つけることができません (私は JDO deletePersistent を使用しています)。パフォーマンスのためにトランザクションを使用せず、競合を回避する場合、並列更新中にデータの正確性を失うことは許されます。

しかし、コードが異なるマシンで同時に実行されているときに、削除操作が後の更新によってオーバーライドされたり、別のマシンでそのエンティティへの以前の読み取りが行われたりしないようにするにはどうすればよいですか? PersistenceManager に任せますアタッチされたオブジェクトへの暗黙の更新。

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

4

2 に答える 2

0

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

トランザクションの使用

トランザクションは、1 つ以上のエンティティに対するデータストア オペレーションのセットです。各トランザクションはアトミックであることが保証されています。つまり、トランザクションが部分的に適用されることはありません。トランザクション内のすべての操作が適用されるか、またはどれも適用されません。

次の場合、操作が失敗することがあります。

エンティティ グループを同時に変更しようとするユーザーが多すぎます。アプリケーションがリソース制限に達しました。データストアで内部エラーが発生しました。

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

于 2012-05-04T15:40:06.747 に答える
0

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

于 2012-07-25T13:01:00.670 に答える