2017-08-04 17 views
0

問題: GAEデータストア内のエンティティを永続化しない場合は、そのエンティティを永続化する必要があります。GAE環境内の複数のJVMインスタンスとのJavaの同期

私のコードのアルゴリズムは、次のとおりです。

select * from Employee where code=1234; 
if record not found then: 
    persist it; 
otherwise 
    do nothing; 

それを行うのは非常に簡単だが、それは、マルチスレッド環境での複雑されます。ここで問題は、2つのスレッドが上記のクエリを同時に実行しようとしている場合に発生します。どちらもnullとなり、両方のスレッドが永続エンティティになります。だから1つではなく、2つのレコードがデータベースに作成されています ここで私は完全なメソッドを同期しましたが、GAE envのjvmの複数のインスタンスのために動作しません。

私に適切な解決策を提案してください。 私のテクノロジースタック:
java、Spring、REST、GAEデータストア。

+0

擬似SQLを表示して[タグ:google-cloud-datastore]がサポートしていないため、[tag:google-cloud-datastore]または[tag:google-cloud-sql]を使用していますか?関係のないタグでタグをスパムしたため、何を求めているのかは不明です。どうか明らかにしてください。 –

+0

私はgoogle-cloud-datastoreを使用しています。Psuedo Sqlは私の必要条件を説明するためのものです。 –

答えて

0

私はあなたが以下のように2種類でこれを回避することができると信じて:

  • 従業カインド - 従業員エンティティのためのあなたの通常のデータを格納

    • キー(自動割り当てられた数値)
    • 従業員番号(コード)
    • 氏名等
  • EmployeeNumberConstraintカインド -

      - これは、従業員番号の新しい従業員を挿入するための

      • (従業員エンティティから従業員番号と同じ)キー

    に一意性を強制するために厳密です

  • トランザクションの開始
  • エンティティを挿入する種類がEmployeeNumberConstraintで、キー値が従業員番号(2.g.既存の従業員番号と従業員のエンティティを挿入しようと1234年)
  • 種類Employeeの実体を挿入します(自動キーや従業員番号= 1234を生成)
  • は、への挿入をトランザクション

をコミットEmployeeNumberConstraintは、ALREADY_EXISTS例外で失敗します。例外が発生した場合は、トランザクションをロールバックします。基本的に、2つの種類とトランザクションを使用してDatastoreによって一意性が保証されています。したがって、アプリケーションで同期を行う必要はありません。

従業員を削除する場合は、Employee種類と対応するEmployeeNumberConstraintの両方のエンティティを同じトランザクションで削除してください。

関連する問題