9

pierwsze, tutaj jest to, co zostało powiedziane w Pymongo DocumentationRead-your-own-pisze spójność MongoDB

Domyślnie PyMongo rozpoczyna wniosek dla każdego wątku, gdy wątek pierwszy uruchamia operację na MongoDB. Gwarantuje to ** czytanie-pisze-zapis spójność. W ramach żądania wątek będzie nadal używać wyłącznie tego samego gniazda, a żaden inny wątek nie użyje tego gniazda, dopóki wątek nie wywoła metody end_request() lub nie zakończy się. W tym momencie gniazdo jest zwracane do puli połączeń w celu użycia przez inne wątki.

więc podczas korzystania z biblioteki asynchronicznej do MongoDB (jak Asyncmongo, silnik), użytkownik będzie mieć konsystencję jak ten w blokowaniu połączeń lub ewentualną konsystencję?

Odpowiedz

6

Istnieje kilka punktów dotyczących tego pytania.

  1. Nie gwarantuje się, że po odczytu i zapisu konsystencję chyba że używasz albo "safe=true", "w=1" (lub nowszej) lub "j=true" z zapisu. Można je dołączyć jako część poleceń insert() lub update() lub użyć set_lasterror_options(), aby ustawić opcje połączenia, bazy danych lub kolekcji, z których korzystasz.

  2. Jeśli pozwalasz na odczyty z drugorzędnych węzłów (np. Odczytanie z wyjątkiem innego niż PODSTAWOWY), to nie otrzymasz semantyki odczytu i zapisu, a jedynie ostateczną spójność.

  3. Jeśli używasz ReadPreference z PRIMARY i ustawiasz odpowiednie opcje lasterror, masz gwarancję uzyskania semantyki read-after-write na wszystkich operacjach, które używają tego samego gniazda, to jest tego samego wątek.

  4. Jeśli używasz wielu wątków i NIE czytasz z węzłów drugorzędnych, masz pewność, że uzyskasz spójność odczytu po zapisie, jeśli wydasz odczyt w drugim wątku po zakończeniu zapisu w pierwszym wątku. Do tego celu można użyć standardowych prymitywów synchronizacji wątków.

+0

myślę że dasz wszystkich możliwości: D używam MongoDB z Tornado, a tornado jest to pętla wydarzenie, więc jest to trudny sposób, aby uzyskać wątki, więc co z bibliotekami Asynch (które nie używać wątków) –

+1

Umm ... to zależy od używanej biblioteki asynch. Obowiązują te same zasady: możesz tylko przeczytać to, co napisałeś, gdy polecenie getLastError() zwróci poprawnie. Po uzyskaniu pomyślnego zwrotu z getLastError(), każdy wątek inicjujący funkcję find() zobaczy zapisane dane. Synchronizacja między wątkami jest pozostawiona jako ćwiczenie dla czytelnika. –

+0

Myślę, że jest to odpowiedź, ponieważ mówi w sposób ogólny, więc muszę tylko zobaczyć, jak działa silnik lub Asyncmongo: D jeszcze raz dziękuję –

3

Jestem autorką silnika i wiem też trochę o AsyncMongo. Oto dokumentacja Motor dotyczące bezpiecznych pisze:

http://emptysquare.net/motor/pymongo/api/motor/differences.html#acknowledged-writes

Krótka odpowiedź: Cokolwiek kod wykonać w zwrotnego wstawić(), update(), etc., czy te wkładki lub aktualizacje są bezpieczny, zobaczą dane w MongoDB po zmiana została zastosowana. Każdy kod, który wykonujesz nie w takim wywołaniu zwrotnym, może być uruchamiany przed lub po wprowadzeniu przez MongoDB zmiany.

+0

dziękuję: D przy okazji, Motor będzie używał WSZYSTKICH zapytań pymongo, z wyjątkiem używania wtedy asynchronicznego sposobu? –

+1

Prawidłowo, to jest intencja. =) –

+0

i kocham ten zamiar;) –

Powiązane problemy