2015-05-04 14 views

Trả lời

3

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.

+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

+0

@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

1

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.

Các vấn đề liên quan