Lý do là hiệu suất. Không cần phải ghi vào đĩa mỗi lần thay đổi, MongoDB có thể xử lý các bản cập nhật nhanh hơn.
MongoDB cho bạn biết khi nào các bản cập nhật đã được phân phối tới máy chủ, không phải khi các bản cập nhật đã được ghi , như bạn có thể đọc trong tài liệu về Xác minh lan truyền trong số Viết bằng getLastError :
Điều này đi ngược lại với ACID , cụ thể hơn là chống lại chữ D, viết tắt của độ bền :
Thuộc tính ACID hầu hết áp dụng cho các hệ thống RDBMS truyền thống. Các hệ thống NoSQL, bao gồm MongoDB, từ bỏ một hoặc nhiều thuộc tính ACID để đạt được khả năng mở rộng tốt hơn. Trong trường hợp của MongoDB, độ bền đã bị hy sinh để có hiệu suất tốt hơn khi xử lý số lượng lớn các bản cập nhật.
MongoDB và ACID
Hầu hết các thuộc tính ACID là đảm bảo ở cấp độ giao dịch . Một giao dịch thường là một nhóm các truy vấn nên được coi như một đơn vị duy nhất. MongoDB không có khái niệm về giao dịch, một lần nữa vì lý do hiệu suất . Do đó, hầu hết các thuộc tính ACID không áp dụng cho MongoDB.
Đ - Atomicity nói rằng một giao dịch có thể thành công hoặc thất bại. Nó không được phép thành công một phần; nếu một phần của giao dịch không thành công, toàn bộ giao dịch sẽ được khôi phục lại. MongoDB hỗ trợ hoạt động nguyên tử ở cấp độ tài liệu, nhưng không phải ở cấp độ 'giao dịch'.
C - Tính nhất quán một phần đề cập đến tính nguyên tử, nhưng cũng bao gồm tính toàn vẹn tham chiếu . Cơ sở dữ liệu quan hệ chịu trách nhiệm đảm bảo rằng tất cả các tham chiếu khóa ngoại đều hợp lệ. MongoDB không có khái niệm về khóa ngoại, vì vậy thuộc tính ACID này không áp dụng.
Tôi - Cô lập nói rằng hai giao dịch đồng thời không được phép can thiệp vào nhau; nếu hai giao dịch cố gắng sửa đổi cùng một dữ liệu, thì giao dịch thứ hai phải đợi giao dịch đầu tiên hoàn thành. Để đạt được điều này, cơ sở dữ liệu sẽ khóa dữ liệu. MongoDB không có khái niệm về khóa, vì vậy nó không hỗ trợ cách ly cho nhiều các hoạt động. Các hoạt động đơn lẻ được tách biệt.
Đ - Độ bền được mô tả ở trên. MongoDB không hỗ trợ độ bền thực sự (chưa), về độ bền ACID-ic.
Bây giờ, bạn có thể nghĩ rằng MongoDB vô dụng so với các hệ thống RDBMS vì nó thiếu các giao dịch và hầu hết các đảm bảo ACID. Tuy nhiên, một phần lý do khiến các giao dịch tồn tại là do cơ sở dữ liệu quan hệ cần phải xử lý một số dữ liệu nhất định như một thực thể duy nhất , nhưng dữ liệu này đã được chuẩn hóa thành nhiều bảng .
MongoDB cho phép bạn lưu trữ dữ liệu của mình dưới dạng một thực thể duy nhất . Điều này loại bỏ nhu cầu về khóa ngoại và tính toàn vẹn tham chiếu trong hầu hết các trường hợp. Bạn cũng không cần các giao dịch nhiều truy vấn, vì bạn không cần nhiều bảng để cập nhật một thực thể. Hầu hết các lần bạn chỉ phải cập nhật một tài liệu duy nhất và các thao tác này là nguyên tử trong MongoDB.
Theo nhận xét đầu tiên trên trang này
, db.eval()
cung cấp sự cô lập cho nhiều hoạt động. Tuy nhiên, theo tài liệu
bạn thường muốn tránh sử dụng db.eval()
.