Tôi đang sử dụng thư viện đa xử lý Python để tạo ra một số quy trình mà mỗi tiến trình ghi vào cơ sở dữ liệu được chia sẻ (MongoDB). Đây có phải là an toàn, hoặc sẽ viết ghi đè lên nhau?Quy trình đồng thời có thể ghi vào cơ sở dữ liệu được chia sẻ không?
Trả lời
Miễn là bạn đảm bảo tạo kết nối cơ sở dữ liệu riêng biệt cho từng quy trình của nhân viên, thật an toàn khi có nhiều quy trình truy cập cơ sở dữ liệu cùng một lúc. Bất kỳ truy vấn nào mà họ phát hành mà thực hiện thay đổi đối với cơ sở dữ liệu sẽ được áp dụng riêng lẻ, thường theo thứ tự mà chúng được cơ sở dữ liệu nhận. Trong hầu hết các tình huống này sẽ được an toàn, nhưng:
Nếu quá trình của bạn được tất cả chỉ là chèn tài liệu vào cơ sở dữ liệu, mỗi chèn thường sẽ tạo ra một đối tượng riêng biệt.
Trường hợp ngoại lệ là nếu bạn chỉ định rõ ràng
_id
cho tài liệu và số nhận dạng đó đã được sử dụng trong bộ sưu tập. Điều này sẽ khiến quá trình chèn bị lỗi. (Vì vậy, đừng làm điều đó: hãy để_id
ra ngoài và MongoDB sẽ luôn tạo ra một giá trị duy nhất cho bạn.)Nếu quy trình của bạn đang xóa tài liệu khỏi cơ sở dữ liệu, thao tác sẽ thất bại nếu một quá trình khác đã bị xóa cùng một đối tượng. (Đây không phải là một thất bại nghiêm trọng, mặc dù, nó chỉ có nghĩa là ai đó đã có trước khi bạn.)
Nếu quá trình của bạn đang cập nhật tài liệu trong cơ sở dữ liệu, mọi thứ trở nên tồi tệ hơn.
Miễn là mỗi quá trình đang cập nhật một tài liệu khác, bạn vẫn ổn.
Nếu nhiều quá trình đang cố gắng cập nhật cùng một tài liệu cùng một lúc, bạn bắt đầu cần phải cẩn thận. Các cập nhật thay thế các giá trị trên một đối tượng sẽ được áp dụng theo thứ tự, điều này có thể gây ra các thay đổi được thực hiện bởi một quá trình vô tình bị ghi đè bởi một quy trình khác. Bạn nên cẩn thận để tránh chỉ định các trường mà bạn không có ý định thay đổi. Sử dụng update operators của MongoDB có thể hữu ích để thực hiện các thao tác phức tạp một cách nguyên tử, chẳng hạn như thay đổi các giá trị số của các trường.
Lưu ý rằng "đồng thời" không nhất thiết có nghĩa là hoạt động đang xảy ra tại chính xác cùng một lúc. Điều này có nghĩa là thường có một "chồng chéo" trong thời gian hai quy trình đang làm việc với cùng một tài liệu, ví dụ:
Process A Process B
--------- ---------
Reads object from DB ...
working... Reads object from DB
working... working...
updates object with changes working...
updates object with changes
Trong tình hình trên, nó có thể cho một số các thay đổi do quá trình A đến vô tình được ghi đè bởi quá trình B.
Nói tóm lại, có nó là hoàn toàn hợp lý (và thực sự ưa thích) để cho cơ sở dữ liệu của bạn lo lắng về sự tương tranh của các hoạt động cơ sở dữ liệu của bạn.
Bất kỳ trình điều khiển cơ sở dữ liệu nào có liên quan (MongoDB đi kèm) sẽ xử lý các thao tác đồng thời cho bạn một cách tự động.
- 1. Tôi có thể đọc và ghi vào cơ sở dữ liệu SQLite đồng thời từ nhiều kết nối không?
- 2. Quy mô cơ sở dữ liệu SQLite trong bộ nhớ có đồng thời không?
- 3. Cơ sở dữ liệu SOA và chia sẻ
- 4. Hạn chế thực thi đồng thời quy trình đăng ký sử dụng cơ sở dữ liệu
- 5. Chia sẻ cơ sở dữ liệu giữa Twisted và Django
- 6. Chia sẻ dữ liệu giữa các quy trình trong Python
- 7. MongoDB: đang đọc/ghi vào cơ sở dữ liệu đồng thời?
- 8. EntityManager không ghi vào cơ sở dữ liệu
- 9. Đồng thời cơ sở dữ liệu an toàn trong ROR
- 10. Cơ sở dữ liệu SQLite Android được chia sẻ giữa các hoạt động
- 11. Redis có thể ghi vào cơ sở dữ liệu như PostgreSQL không?
- 12. Ứng dụng Rails và api goliath và cơ sở dữ liệu/mô hình chia sẻ
- 13. Tái cấu trúc cách xa mô hình Cơ sở dữ liệu được chia sẻ
- 14. Cách nhận url cơ sở dữ liệu được chia sẻ trong heroku
- 15. Cơ sở dữ liệu xây dựng quy trình quản lý
- 16. Đọc và cập nhật đồng thời trong một bảng cơ sở dữ liệu
- 17. Làm thế nào để chèn một bản ghi đồng thời vào hai bảng cơ sở dữ liệu?
- 18. Chia nhỏ tệp mysqldump với nhiều cơ sở dữ liệu, theo cơ sở dữ liệu
- 19. Chia sẻ dữ liệu toàn cầu tĩnh giữa các quy trình trong ứng dụng Gunicorn/Flask
- 20. Mongoose có cho phép nhiều yêu cầu cơ sở dữ liệu đồng thời không?
- 21. Phong cách SOA - Chia sẻ dữ liệu
- 22. Truy cập đồng thời vào mảng được chia sẻ có vấn đề trong Node.js
- 23. Chia sẻ dữ liệu giữa AppDomains
- 24. Có cơ sở dữ liệu SQL có thể khôi phục kịp thời không?
- 25. Biến toàn cầu trong thư viện/dll được chia sẻ, được chia sẻ qua quá trình
- 26. Có được nhiều lượt xem cơ sở dữ liệu không?
- 27. Tiết kiệm 1000+ bản ghi vào cơ sở dữ liệu tại một thời điểm
- 28. Không thể đăng nhập vào cơ sở dữ liệu PostgreSQL
- 29. Truy cập tập tin được đồng bộ hóa 5.x PHP (không có cơ sở dữ liệu)
- 30. Không thể ghi vào tệp cơ sở dữ liệu chmod 777 trên SQlite3 qua php 5.3.0
Điều gì xảy ra nếu bạn sử dụng cùng một kết nối cho tất cả các quy trình của nhân viên? – Jessica
@Jessica Những điều tồi tệ. (Nhiều quá trình có thể cố gắng ghi vào kết nối cùng một lúc, và MongoDB sẽ nhận được một lộn xộn lộn xộn và có lẽ chỉ cần thả kết nối.) Vì vậy, không làm điều đó. :) – duskwuff