2013-07-23 16 views
8

Z docs:Wersjonowanie mongoose: kiedy można go bezpiecznie wyłączyć?

versionKey jest właściwością ustawić na każdym dokumencie po raz pierwszy stworzył przez Mongoose. Ta wartość kluczy zawiera wewnętrzną wersję dokumentu . Nazwę tej właściwości dokumentu można konfigurować. Domyślną wartością jest 01_35. Jeśli jest to sprzeczne z aplikacją można takiego skonfigurować:

[...]

wersjonowanie dokumentów może również zostać wyłączone poprzez ustawienie versionKey do fałszywe. NIE WYŁĄCZAJ wersji, chyba że wiesz, co robisz.

Ale jestem ciekaw, w jakich przypadkach powinno być bezpiecznie wyłączyć tę funkcję?

+1

Ten wpis na blogu opowiada o przypadku, w którym można uzyskać dostęp elementy w dokument podrzędny tablicy pozycyjnie. Ale mangusta faktycznie używa ids zamiast pozycji. Nie jestem też pewien: http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning –

Odpowiedz

20

Głównym celem wersji jest optymistyczne blokowanie.

Po włączeniu wartość wersji jest atomowo zwiększana za każdym razem, gdy dokument jest aktualizowany.

Pozwala to na testowanie kodu aplikacji w celu sprawdzenia, czy dokonano zmian między pobieraniem (na przykład przy wprowadzaniu klucza wersji 42) a kolejną aktualizacją (zapewnienie wartości wersji nadal wynosi 42). Jeśli klucz wersji ma inną wartość (np. 43, ponieważ dokonano aktualizacji dokumentu), kod aplikacji może obsłużyć modyfikację współbieżną.

Ta sama koncepcja jest często używana w relacyjnych bazach danych zamiast pesymistycznych blokad, które mogą przynieść straszne wyniki. Wszystkie ORM zejścia zapewniają taką funkcję. Na przykład jest ładnie opisany in ObjectDB documentation. Jest to obiektowa baza danych zaimplementowana w Javie, ale dotyczy to tej samej koncepcji.

Dołączona w komentarzu Behlül blog post demonstruje optymistyczną użyteczność blokowania za pomocą konkretnego przykładu, ale tylko w przypadku zmian w tablicach, patrz poniżej.

Z drugiej strony, jest to prosty przypadek, w którym jest bezużyteczny: profil użytkownika, który może być edytowany przez właściciela. Tutaj możesz pozbyć się optymistycznego blokowania i założyć, że ostatnia edycja zawsze wygrywa.

Dzięki temu wiadomo tylko, czy aplikacja wymaga optymistycznego blokowania, czy nie. Użyj case by use.

Sytuacja w Mongoose jest nieco wyjątkowa.

Optymistyczne blokowanie jest włączone tylko dla tablic, ponieważ format pamięci wewnętrznej korzysta z indeksu pozycyjnego. Jest to problem opisany przez blog post powiązany z komentarzem do pytania. Zauważyłem, że explanation podany na liście mailingowej mongoose-orm jest jasny: jeśli potrzebujesz optymistycznego blokowania dla innych pól, musisz sam sobie z tym poradzić.

Oto gist pokazujący, jak zaimplementować strategię ponawiania dla operacji add. Ponownie, jak chcesz sobie z tym poradzić, zależy od przypadków użycia, ale powinno wystarczyć, aby zacząć.

Mam nadzieję, że to wszystko wyjaśni.

Cheers

+1

Czy potrzebujemy kontroli wersji, jeśli używamy operatora '$ in', aby uzyskać dostęp do subdokumentów. Nie wygląda to inaczej niż dostęp do dokumentu nadrzędnego. –

+0

Ponownie, zależy to od przypadku użycia. Korzystając z operatora $ in, dokręcasz okno modyfikacji współbieżnych, ale pamiętaj, że jest on nadal otwarty. – eskatos

+1

@esKotos Wydaje mi się, że twoja nowa zaktualizowana odpowiedź wydaje się niejednoznaczna, ponieważ wersja nie działa, gdy aktualizujemy tylko pole inne niż tablica. –

Powiązane problemy