MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tính nguyên tử, cô lập và đồng thời trong MongoDB

Cơ sở dữ liệu quan hệ phổ biến nhất hiện nay hỗ trợ “ ACID ”Thuộc tính - Tính nguyên tử, Tính nhất quán, Tính cô lập và Độ bền. Các nhà phát triển và DBA (Quản trị viên cơ sở dữ liệu) làm việc với cơ sở dữ liệu quan hệ có hiểu biết tốt về hành vi ACID. Tuy nhiên, khi làm việc với cơ sở dữ liệu NoSQL như đám mây MongoDB, có một số điểm khác biệt chính mà bạn cần hiểu. MongoDB cung cấp sự linh hoạt tuyệt vời trong lưu trữ, lược đồ và tỷ lệ, nhưng lại nới lỏng một số thuộc tính ACID. Điều cần thiết là phải hiểu sự khác biệt khi bạn lập mô hình dữ liệu của mình và thực thi các lệnh MongoDB.

Tính nguyên tử

Wikipedia định nghĩa “Tính nguyên tử” như sau - “Trong một giao dịch nguyên tử , một loạt các hoạt động cơ sở dữ liệu tất cả xảy ra, hoặc không có gì xảy ra. Việc đảm bảo tính nguyên tử ngăn các cập nhật đối với cơ sở dữ liệu chỉ xảy ra một phần, điều này có thể gây ra các vấn đề lớn hơn sau đó từ chối toàn bộ chuỗi hoàn toàn. Nói cách khác, tính nguyên tử có nghĩa là không thể phân chia không thể thu thập được ”.

Thao tác ghi trong MongoDB là nguyên tử, chỉ ở cấp độ của một tài liệu duy nhất. Nếu bạn đang sửa đổi nhiều tài liệu con bên trong một tài liệu, thao tác vẫn là nguyên tử, nhưng nếu bạn đang sửa đổi nhiều tài liệu, thao tác không phải là nguyên tử. Vì vậy, làm thế nào để bạn đạt được hành vi nguyên tử trên nhiều tài liệu? Bạn cần sử dụng mô hình “cam kết hai pha” để đạt được độ nguyên tử mong muốn. Dưới đây là một ví dụ tuyệt vời từ tài liệu MongoDB về cách triển khai mẫu này. Mô hình cam kết hai giai đoạn không phải là chuyện nhỏ để triển khai và thực hiện đúng - vì vậy hãy đảm bảo tính nguyên tử của nhiều lần ghi tài liệu là điều bạn muốn thực hiện.

Cách ly

Wikipedia định nghĩa “Cách ly” như sau - “Trong hệ thống cơ sở dữ liệu, cách ly là thuộc tính xác định cách thức / thời điểm các thay đổi được thực hiện bởi một hoạt động trở nên hiển thị với các hoạt động đồng thời khác ”. Có nhiều cách để đạt được Cô lập với các hoạt động MongoDB của bạn, ví dụ:

  1. Lệnh “findAndModifyOperation ()”

    Đây là một trong những cách đơn giản nhất để truy vấn và sửa đổi các tài liệu hiện có. Lệnh có thể trả về giá trị trước đó của tài liệu hoặc giá trị cập nhật mới của tài liệu. Bạn cũng có thể sắp xếp các tài liệu phù hợp, bổ sung và chọn trường nào cần được trả lại:

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. Mẫu "Cập nhật nếu hiện tại"

    Mẫu này được chỉ định trong tài liệu MongoDB. Nó bao gồm nhiều công việc thủ công hơn nhưng cung cấp cho bạn nhiều quyền kiểm soát hơn.

  3. Nhà điều hành $ cô lập

    Toán tử cách ly $ cung cấp một cách để cô lập việc ghi vào nhiều tài liệu. Tuy nhiên, toán tử cách ly $ không cung cấp đảm bảo tất cả hoặc không có gì - bạn sẽ cần sử dụng một số kỹ thuật nguyên tử được chỉ định trong phần đầu tiên để đạt được điều đó. Ngoài ra, toán tử cách ly $ không hoạt động đối với các phân đoạn. Lệnh này từng được gọi là “$ nguyên tử” - hiện tại nó đã được đổi tên chính xác thành “$ cô lập”.

Đồng tiền

MongoDB sử dụng khóa để ngăn nhiều ứng dụng khách cập nhật cùng một phần dữ liệu cùng một lúc. MongoDB 2.2+ sử dụng khóa cấp độ “cơ sở dữ liệu”. Vì vậy, khi một thao tác ghi khóa cơ sở dữ liệu, tất cả các thao tác ghi khác vào cùng một cơ sở dữ liệu (ngay cả khi chúng thuộc một bộ sưu tập riêng biệt) sẽ bị chặn khi chờ khóa. MongoDB sử dụng các khóa "người viết tham lam" có lợi cho việc ghi hơn các lần đọc. Trong 2.2+, một số hoạt động lâu dài nhất định có thể dẫn đến khóa của chúng.

An toàn chuỗi

Không phải tất cả các lớp ứng dụng MongoDB đều an toàn cho luồng - vui lòng tham khảo tài liệu về trình điều khiển cụ thể của bạn để kiểm tra xem các lớp bạn đang sử dụng có an toàn cho luồng hay không. Ví dụ, trong trình điều khiển Java, lớp MongoClient là luồng an toàn. Vì vậy, bạn có thể sử dụng một phiên bản duy nhất của lớp này trên tất cả các luồng của bạn. Trong nội bộ, MongoClient sử dụng một nhóm kết nối để quản lý các kết nối đến máy chủ MongoDB.

Như thường lệ, nếu bạn có bất kỳ câu hỏi nào, vui lòng liên hệ với chúng tôi theo địa chỉ [email protected].


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Tổng hợp kết nối và thời gian chờ là gì?

  2. Giới hạn kích thước tài liệu đơn MongoDB là 16MB

  3. Node mongoose tìm truy vấn trong vòng lặp không hoạt động

  4. Truy vấn Mongoose near (...) trên trường được lập chỉ mục 2dsphere không trả về kết quả hợp lệ

  5. Làm cách nào để sắp xếp bộ sưu tập Sao băng theo thời gian chèn?