Jako ogólną odpowiedź, zatwierdzenia wielodokumentowe w MongoDB mogą być wykonywane jako zatwierdzenia dwufazowe, które zostały dość obszernie udokumentowane w podręczniku (patrz:http://docs.mongodb.org/manual/tutorial/perform-two-phase- zobowiązania/).
Schemat sugerowany w instrukcji jest krótko następujący:
- Skonfiguruj oddzielne
transactions
kolekcja, która zawiera dokument docelowy , dokument źródłowy , wartość i stan (transakcji) - Utwórz nowy obiekt transakcji za pomocą
initial
jakostate
- Rozpocznij dokonywanie transakcji i zaktualizuj
state
napending
- Zastosuj transakcje do obu dokumentów (cel, źródło)
- Zaktualizuj stan transakcji do
committed
- Użyj find, aby określić, czy dokumenty odzwierciedlają stan transakcji, jeśli OK, zaktualizuj stan transakcji do
done
Ponadto:
- Musisz ręcznie obsługiwać scenariusze awarii (coś się nie stało, jak opisano poniżej)
- Musisz ręcznie zaimplementować wycofanie, po prostu wprowadzając nazwę
state
wartośćcanceling
Kilka konkretnych uwag dotyczących Twojej implementacji:
- Odradzałbym dodawanie pól takich jak
lock_status
,data_old
,data_new
na dokumenty źródłowe/docelowe. Powinny to być właściwości transakcji, a nie same dokumenty. - Aby uogólnić koncepcję dokumentów docelowych/źródłowych, myślę, że możesz użyć
DBref
s:http://www.mongodb.org/display/DOCS/Database+References - Nie podoba mi się pomysł usuwania dokumentów transakcyjnych po ich zakończeniu. Ustawienie stanu na
done
wydaje się lepszym pomysłem, ponieważ pozwala to później debugować i dowiedzieć się, jakie transakcje zostały wykonane. Jestem prawie pewien, że nie zabraknie Ci miejsca na dysku (a do tego też istnieją rozwiązania). - Jak w swoim modelu gwarantujesz, że wszystko zostało zmienione zgodnie z oczekiwaniami? Czy jakoś sprawdzasz zmiany?