Używam biblioteki przetwarzania wieloprocesorowego Python do generowania kilku procesów, które każdy zapisuje w udostępnionej bazie danych (MongoDB). Czy to jest bezpieczne, czy też zapisy nadpisują się nawzajem?Czy procesy współbieżne mogą zapisywać dane w udostępnionej bazie danych?
Odpowiedz
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.
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.
- 1. Czy mogę czytać i zapisywać dane w bazie danych SQLite jednocześnie z wielu połączeń?
- 2. Czy TRegistry mogą zapisywać wartości REG_NONE?
- 3. Dane hierarchii przenoszenia w bazie danych
- 4. Czy wykresy baz danych mogą efektywnie dystrybuować dane między węzłami?
- 5. Dane URI vs. Binary w bazie danych
- 6. Jak zapisywać dane w iOS
- 7. sqlite3 wstaw i odczytaj dane BLOB w bazie danych
- 8. Najlepsza strategia składowania danych podstawowych (kiedy zapisywać dane na dysku)
- 9. Procesy demona nie mogą mieć dzieci
- 10. Czy baza danych Azure jest odpowiednikiem klientów Firebase, którzy mogą nasłuchiwać zmian w bazie danych?
- 11. Czy dwa procesy mogą być renderowane na jednym kanale OpenGL?
- 12. seler: demoniczny procesy nie mogą mieć dzieci
- 13. Jak zabezpieczyć dane użytkownika w bazie danych za pomocą Railsów?
- 14. Jak zapisywać dane przy użyciu FileOutputStream bez utraty starych danych?
- 15. Czy dwa procesy mogą jednocześnie uzyskać dostęp do pamięci (: pamięci :) bazy danych sqlite?
- 16. Czy Jtable może zapisywać dane, gdy komórka traci ostrość?
- 17. Przewidywanie brakujących wartości danych w bazie danych
- 18. jak przechowywać dane w bazie danych w HTML5
- 19. współbieżne ArrayList
- 20. Możliwe, że DbContext Ignoruje dane migracji/wersji w bazie danych?
- 21. Czy można przechowywać javascript w bazie danych?
- 22. dane zapisywać na dysk w Pythonie jako proces w tle
- 23. Czy mogę przechowywać informacje z Google API w bazie danych?
- 24. Zwiększanie licznika w bazie danych
- 25. Gdzie sitecore przechowuje dane statystyki pozycji w bazie danych ..?
- 26. Zapytanie nie zwracające nic, gdy są dane w bazie danych
- 27. stanie aktualizować dane w bazie danych za pośrednictwem formularza CakePHP
- 28. dane binarne w bazie danych, blob kontra skompresowany base64
- 29. Czy istnieje narzędzie do sprawdzania zapytań w bazie danych?
- 30. W jaki sposób mogę przechowywać dane geograficzne w bazie danych Androida i wyszukiwać dla niej dane?
Co się stanie, jeśli używasz tego samego połączenia dla wszystkich procesów roboczych? – Jessica
@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