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
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 –