2013-02-03 19 views
7

私は、GETにあったバージョン番号をPUT呼び出しに戻してデータベーステーブルに1対1のマッピングを持つRESTリソースに対してオプティミスティックロックを実装しました。 GETとPUTの間にバージョン番号がデータベースで変更された場合、楽観的なロック例外が発生しました。かなりシンプルなデザイン。RESTで粗いオプティミスティック・ロックをどのように実装しますか?

ここで、複数のデータベーステーブルにマップされる複合RESTリソースの場合、同じことをどうやって行うのですか?複数のバージョンフィールド(複合リソースに関連する各データテーブルの1つ)を返す必要はありません。複合リソースの単純な例は/ FooBarです。ここで、/ Fooおよび/ Barは非複合リソースです。

私は基本的にはファウラーの粗視化ロックパターンのREST実装の例を探しています:http://martinfowler.com/eaaCatalog/coarseGrainedLock.html

+0

RESTサービスでは、バージョンを収集し、それらをバージョンを表す一意に生成されたIDをキーとするマップに入れることができますか?それをクライアントに送って、編集後に送り返してもらえますか?次に、そのidを使ってエンティティのグラフのバージョンを取得できます。 –

答えて

5

これはETag headerがために設計されたものです。これを実装する最も一般的な方法は、レスポンスペイロードを生成し、そのハッシュを作成します(安全である必要はなく、低衝突のみです)。そして、そのハッシュをETagの値として使用します。このアプローチは、レスポンスを生成するためにいくつのソースが関与しているかを知らないことに注意してください。

クライアントは受信したETagIf-Matchヘッダーに戻します。サーバーはこの要求の最新性をチェックできます。

+0

そして、十分に新鮮でない場合、HTTPサーバーは[409(競合)ステータスコード](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.10)を送信します。実際には –

+0

412です。 http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-21#section-3.1 – fumanchu

+0

興味深いことに、面白いです。例えば、バージョニングが使用されていて、PUTされているエンティティが以前の(サードパーティーの)要求によって生成されたものと競合するリソースに変更された場合、409の例はかなり明白です。サーバーは要求を完了できないことを示すために409応答を使用する可能性があります。 " –

関連する問題