2013-02-03 8 views
7

Ich habe eine optimistische Sperrung für meine REST-Ressourcen implementiert, die eine 1-zu-1-Zuordnung zu Datenbanktabellen haben, indem eine Versionsnummer, die im GET zurückgegeben wurde, an den PUT-Aufruf zurückgegeben wird. Wenn sich die Versionsnummer in der Datenbank zwischen dem Zeitpunkt, an dem ich das GET und das PUT abschloss, geändert hat, ist eine optimistische Sperrenausnahme aufgetreten. Ziemlich einfaches Design.Wie implementieren Sie eine grobkörnige optimistische Sperre in REST?

Wie mache ich das Gleiche für zusammengesetzte REST-Ressourcen, die mehreren Datenbanktabellen zugeordnet sind? Ich möchte nicht mehrere Versionsfelder zurückgeben müssen (eines für jede Datentabelle, die sich auf die zusammengesetzte Ressource bezieht). Ein vereinfachtes Beispiel für eine zusammengesetzte Ressource wäre/FooBar, wobei/Foo und/Bar nicht zusammengesetzte Ressourcen sind.

ich im Grunde bin für ein Beispiel für den REST Implementierung von Fowler grobkörnigem Locking Muster suchen: http://martinfowler.com/eaaCatalog/coarseGrainedLock.html

+0

In Ihrem REST-Service können Sie nur die Versionen sammeln und sie in eine Map einfügen, die durch eine eindeutig generierte ID codiert wird, die die Version darstellt? Dann senden Sie das an den Client und lassen Sie es nach einer Bearbeitung an Sie zurücksenden? Dann können Sie diese eine ID verwenden, um die Versionen für den Graphen von Entitäten zu erhalten. –

Antwort

5

Dies ist, was die ETag header für entworfen wurde. Eine sehr übliche Methode zur Implementierung besteht darin, die Antwort-Payload zu erstellen, einen Hashwert zu erstellen (sie muss nicht sicher sein, nur eine geringe Kollision) und dann diesen Hashwert als ETag-Wert verwenden. Beachten Sie, dass dieser Ansatz nicht weiß, wie viele Quellen an der Erstellung der Antwort beteiligt sind.

Der Client sendet dann die empfangene ETag zurück in eine If-Match Kopfzeile, die der Server verwenden kann, um die Aktualität der Anfrage zu überprüfen.

+0

Und wenn es nicht "frisch" genug ist, sendet der HTTP-Server einen [409 (Konflikt) Statuscode] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.10). –

+0

412 tatsächlich. Siehe http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-21#section-3.1 – fumanchu

+0

Hmm, interessant. Die Spezifikation ist dann nachsichtig, da das Beispiel in 409 ziemlich explizit ist: "Wenn zum Beispiel Versionierung verwendet wird und die Entität, die PUT ist, Änderungen an einer Ressource enthält, die mit denen einer früheren (dritten) Anfrage in Konflikt stehen, wird Der Server verwendet möglicherweise die 409-Antwort, um anzugeben, dass die Anfrage nicht abgeschlossen werden kann. " –