JDO を使用して Datastore エンティティにアクセスしています。異なるプロセスが同じエンティティに並行してアクセスし、これを解決する方法がわからないため、現在問題が発生しています。
値と計算値を含むエンティティがあります: (キー、値1、値2、値3、計算)
計算は別のタスク キューで行われます。ユーザーはいつでも値を編集できます。値が更新されると、新しいタスクがキューにプッシュされ、古い計算値が上書きされます。
私が現在抱えている問題は、次のシナリオにあります。
- ユーザーがエンティティを作成
- タスクが開始されました
- ユーザーは最初のエントリのエラーに気付き、エンティティをすばやく更新します
- タスクは古いデータ (ステップ 1 から) に基づいて終了し、エンティティ全体を上書きし、新しく入力された値 (ステップ 3 から) も削除します。
- ユーザーが満足していない
だから私の質問:
- 手順 4 で更新時にタスクを失敗させることはできますか? タスクをトランザクションにラップしても、結果整合性のため、すべてのケースでこの問題が解決されるわけではないようです (または、データストア トランザクションに関する私の理解が間違っている可能性があります)。
- エンティティの単一フィールドを更新する唯一の方法は低レベルの setProperty メソッドを使用することですか?これで問題は解決しますか?
- 上記のいずれでもない場合、このようなユースケースに対処する最善の方法は何ですか?
バックグラウンド:
現時点では、一貫性のためにパフォーマンスを犠牲にすることは気にしません。性能については後ほど。
これは私にとって初めての AppEngine アプリケーションであり、学習プロセスであったため、いくつかのベスト プラクティスは使用していません。後から考えると、自分のデータ スキーマについて、より長く、より真剣に考える必要があったことは十分承知しています。たとえば、適切な先祖関係を使用しているエンティティはありません。私はリレーショナルのバックグラウンドから来ており、それが示しています。
おそらく Objectify に移行する大規模なリファクタリングを計画していますが、それまでの間、できるだけ早く解決する必要がある緊急の問題がいくつかあります。そして、まずデータストアを完全に理解したいと思います。