各ユーザーには宝石のコレクションがあります。これらの宝石は、REST APIを介してアクセスすることができますREST - リソースの収集とIf-MatchヘッダーへのPOSTのとき
GET /user/<user id>/gem -> get all gems
GET /user/<user id>/gem/<gem id> -> get an existing gem
POST /user/<user id>/gem -> add a new gem
PUT /user/<user id>/gem/<gem id> -> edit an existing gem
DELETE /user/<user id>/gem/<gem id> -> delete an existing gem
私はPOST
HTTPメソッドを介して宝石を追加することができ、同時に実行して、いくつかのバックエンドプロセスを、持っています。 (PUT
)や削除(DELETE
)の宝石を削除することもできますが、それは私の質問では重要ではありません)
高度な見解から見ると、 :
1. GET /user/<current user id>/gem
2. some calculations, based on step 1
3a. if (step 2 decided that a gem should be added)
3b. POST /user/<current user id>/gem
このように、これらのプロセスは並行して実行されます。通常、2つのプロセスは同じユーザーの宝石を管理していませんが、発生する可能性があります。
したがって、その間に何か変更があった場合は、3b
のPOST
を禁止する仕組みが必要です。 ETagsとオプティミスティックロックの使用について考えました:
1. GET /user/<current user id>/gem and remember the returned ETag
2. some calculations, based on step 1
3a. if (step 2 decided that a gem should be added)
3b. POST /user/<current user id>/gem with header 'If-Match=<ETag from step 1>'
3c. if (server returns 412 - precondition failed)
3d. start again at step 1
私はETagsがこれを意図しているかどうかわかりません。 ETagのほとんどの例は約1つの単一リソース(/gem/23
など)ですが、リソースの集合(/gem
など)についてのものではありません。つまり、ステップ3b
では、完全な宝石コレクションのETagを提供していますが、本質的に私は1つの宝石を追加して提供しています。
弱いETagを使用していることを思い出してくれてありがとう! –