2013-02-03 25 views
7

Zaimplementowałem optymistyczne blokowanie dla moich zasobów REST, które mają odwzorowanie 1 do 1 na tabele bazy danych, przekazując ponownie numer wersji, który był w GET z powrotem do wywołania PUT. Jeśli numer wersji zmienił się w bazie danych między czasem wykonania GET i PUT, wystąpił wyjątek optymalizacji blokady. Całkiem prosta konstrukcja.W jaki sposób zaimplementować gruboziarnistą optymistyczną blokadę w REST?

Teraz, jak zrobić to samo dla złożonych zasobów REST, które mapują do wielu tabel bazy danych? Nie chciałbym przekazywać wielu pól wersji (jedna dla każdej tabeli danych, która odnosi się do zasobu złożonego). Uproszczonym przykładem złożonego zasobu byłoby/FooBar gdzie/Foo i/Bar są zasobami nie będącymi złożonymi.

Szukam zasadniczo na przykład implementacja reszta wzór Gruba Grained Locking Fowlera: http://martinfowler.com/eaaCatalog/coarseGrainedLock.html

+0

W usłudze REST można po prostu zebrać wersje i umieścić je w mapie, która jest kluczowana przez unikalnie wygenerowany identyfikator reprezentujący wersję? Następnie wyślij to do klienta i poproś, aby odesłał go do ciebie po edycji? Następnie możesz użyć tego jednego identyfikatora, aby uzyskać wersje dla wykresu podmiotów. –

Odpowiedz

5

To właśnie ETag header została zaprojektowana. Bardzo powszechnym sposobem jego implementacji jest wygenerowanie ładunku odpowiedzi, wykonanie skrótu (nie musi to być bezpieczne, po prostu niewielkie zderzenie), a następnie użycie tego skrótu jako wartości ETag. Należy zauważyć, że takie podejście nie jest znane, ile źródeł jest zaangażowanych w wytwarzanie odpowiedzi.

Klient wysyła następnie odebrany ETag w nagłówek If-Match, którego serwer może użyć do sprawdzenia świeżości żądania.

+0

A jeśli nie jest wystarczająco "świeży", serwer HTTP wysyła kod statusu [409 (konflikt)] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.10). –

+0

412 w rzeczywistości. Zobacz http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-21#section-3.1 – fumanchu

+0

Hmm, interesujące. Specyfikacja jest wtedy łagodna, ponieważ przykład w 409 jest dość wyraźny: "Na przykład, jeśli wersja była używana, a jednostka zawierająca PUT zawierała zmiany w zasobie, który jest sprzeczny z tym, który został złożony przez wcześniejsze żądanie (strony trzeciej), serwer może użyć odpowiedzi 409, aby wskazać, że nie może ukończyć żądania ". –

Powiązane problemy