2015-05-04 16 views

Odpowiedz

3

Dopóki upewnisz się, że tworzysz oddzielne połączenie z bazą danych dla każdego procesu roboczego, całkowicie bezpiecznie jest mieć wiele procesów uzyskujących dostęp do bazy danych w tym samym czasie. Wszelkie zapytania, które wprowadzają, które wprowadzają zmiany w bazie danych, będą stosowane indywidualnie, zazwyczaj w kolejności, w jakiej są odbierane przez bazę danych. W większości sytuacji będzie to bezpieczne, ale:

  • Jeśli procesy są tylko wstawianie dokumentów do bazy danych, każda wkładka zazwyczaj utworzyć oddzielny obiekt.

    Wyjątkiem jest jednoznaczne podanie _id dla dokumentu i ten identyfikator został już użyty w kolekcji. Spowoduje to niepowodzenie wstawienia. (Więc nie rób tego: pozostaw wydane _id, a MongoDB zawsze wygeneruje dla ciebie unikalną wartość.)

  • Jeśli twoje procesy usuwają dokumenty z bazy danych, operacja się nie powiedzie, jeśli inny proces już został usunięty ten sam obiekt. (Nie jest to jednak wyłącznie błąd, oznacza to tylko, że ktoś inny dostał się przed tobą.)

  • Jeśli twoje procesy aktualizują dokumenty w bazie danych, sprawy stają się coraz mętniejsze.

    Dopóki każdy proces aktualizuje inny dokument, wszystko jest w porządku.

    Jeśli wiele procesów próbuje zaktualizować ten sam dokument w tym samym czasie, należy zachować ostrożność. Aktualizacje zastępujące wartości na obiekcie zostaną zastosowane w kolejności, co może spowodować, że zmiany wprowadzone przez jeden proces zostaną przypadkowo nadpisane przez inny. Powinieneś uważać, aby nie określać pól, których nie zamierzasz zmieniać. Korzystanie z MongoDB's update operators może być pomocne w wykonywaniu złożonych operacji w sposób atomowy, takich jak zmiana wartości liczbowych pól.

Zauważ, że „w tym samym czasie” nie musi oznaczać, że operacje są występujące w dokładnie tym samym czasie. Oznacza to bardziej ogólnie, że istnieje "nakładanie się" w czasie, gdy dwa procesy działają z tym samym dokumentem, np.

Process A     Process B 
---------     --------- 
Reads object from DB   ... 
working...     Reads object from DB 
working...     working... 
updates object with changes working... 
          updates object with changes 

W powyższej sytuacji, jest to możliwe dla niektórych zmian dokonanych przez proces A do przypadkowo nadpisane przez proces B.

+0

Co się stanie, jeśli używasz tego samego połączenia dla wszystkich procesów roboczych? – Jessica

+0

@Jessica Złe rzeczy. (Wiele procesów może próbować pisać do połączenia w tym samym czasie, a MongoDB dostanie pomieszany bałagan i prawdopodobnie po prostu zrzuci połączenie.) Więc nie rób tego. :) – duskwuff

1

w skrócie, tak to jest całkowicie uzasadnione (i faktycznie preferowany) do wynajęcia Twoja baza danych martwi się o współbieżność operacji bazy danych.

Każdy odpowiedni sterownik bazy danych (w tym MongoDB) będzie automatycznie obsługiwać operacje równoległe.

Powiązane problemy