Hướng dẫn mongodb write conflict - mongodb viết xung đột
Trên trang này
MongoDB cho phép nhiều máy khách đọc và viết cùng một dữ liệu. Để đảm bảo tính nhất quán, MongoDB sử dụng kiểm soát khóa và kiểm soát đồng thời để ngăn khách hàng sửa đổi cùng một dữ liệu. Viết vào một tài liệu duy nhất xảy ra đầy đủ hoặc hoàn toàn và khách hàng luôn thấy dữ liệu nhất quán. MongoDB sử dụng khóa đa lỗ [1] cho phép các hoạt động khóa ở cấp độ toàn cầu, cơ sở dữ liệu hoặc thu thập và cho phép các công cụ lưu trữ riêng lẻ thực hiện kiểm soát đồng thời của riêng họ dưới cấp độ thu thập (ví dụ: ở cấp độ tài liệu trong Wiredtiger) . MongoDB sử dụng các khóa của người đọc cho phép người đọc đồng thời chia sẻ quyền truy cập vào một tài nguyên, chẳng hạn như cơ sở dữ liệu hoặc bộ sưu tập. Ngoài chế độ khóa được chia sẻ để đọc và chế độ khóa độc quyền (x) cho các hoạt động ghi, các chế độ chia sẻ ý định (IS) và ý định (ix) cho thấy ý định đọc hoặc viết tài nguyên bằng cách sử dụng khóa chi tiết tốt hơn . Khi khóa ở một mức độ chi tiết nhất định, tất cả các cấp cao hơn đều bị khóa bằng cách sử dụng khóa ý định. Ví dụ: khi khóa bộ sưu tập để viết (sử dụng chế độ X), cả khóa cơ sở dữ liệu tương ứng và khóa toàn cầu phải được khóa ở chế độ INSTENT EXCLUST (IX). Một cơ sở dữ liệu duy nhất có thể đồng thời bị khóa ở chế độ IS và IX, nhưng khóa độc quyền (x) không thể cùng tồn tại với bất kỳ chế độ nào khác và khóa được chia sẻ chỉ có thể cùng tồn tại với khóa được chia sẻ (IS). Khóa là công bằng, với các yêu cầu khóa cho các lần đọc và ghi được xếp hàng theo thứ tự. Tuy nhiên, để tối ưu hóa thông lượng, khi một yêu cầu khóa được cấp, tất cả các yêu cầu khóa tương thích khác được cấp cùng một lúc, có khả năng phát hành khóa trước khi yêu cầu khóa mâu thuẫn được thực hiện. Ví dụ, hãy xem xét một tình huống mà khóa X vừa được phát hành và hàng đợi xung đột có chứa các khóa này: Là → là → x → x → s → là Trong lần đầu tiên đến, đặt hàng đầu tiên (FIFO), chỉ có hai chế độ đầu tiên được cấp. Thay vào đó, MongoDB thực sự sẽ cấp tất cả các chế độ là và S, và một khi tất cả đều thoát ra, nó sẽ cấp X, ngay cả khi các yêu cầu mới hoặc S đã được xếp hàng trong thời gian đó. Vì một khoản trợ cấp sẽ luôn di chuyển tất cả các yêu cầu khác trước trong hàng đợi, không có bất kỳ yêu cầu nào của bất kỳ yêu cầu nào. Trong đầu ra
Đối với hầu hết các hoạt động đọc và viết, Wiredtiger sử dụng kiểm soát đồng thời lạc quan. Wiredtiger chỉ sử dụng khóa ý định ở cấp độ toàn cầu, cơ sở dữ liệu và thu thập. Khi công cụ lưu trữ phát hiện xung đột giữa hai hoạt động, người ta sẽ phát sinh xung đột ghi khiến MongoDB thử lại hoạt động đó một cách minh bạch. Một số hoạt động toàn cầu, thường là các hoạt động sống ngắn liên quan đến nhiều cơ sở dữ liệu, vẫn yêu cầu khóa "toàn bộ trường hợp" toàn cầu. Một số hoạt động khác, chẳng hạn như Để báo cáo về thông tin sử dụng khóa trên khóa, hãy sử dụng bất kỳ phương pháp nào trong số này:
Cụ thể, tài liệu Trong đầu ra
Đối với hầu hết các hoạt động đọc và viết, Wiredtiger sử dụng kiểm soát đồng thời lạc quan. Wiredtiger chỉ sử dụng khóa ý định ở cấp độ toàn cầu, cơ sở dữ liệu và thu thập. Khi công cụ lưu trữ phát hiện xung đột giữa hai hoạt động, người ta sẽ phát sinh xung đột ghi khiến MongoDB thử lại hoạt động đó một cách minh bạch. Một số hoạt động toàn cầu, thường là các hoạt động sống ngắn liên quan đến nhiều cơ sở dữ liệu, vẫn yêu cầu khóa "toàn bộ trường hợp" toàn cầu. Một số hoạt động khác, chẳng hạn như Để báo cáo về thông tin sử dụng khóa trên khóa, hãy sử dụng bất kỳ phương pháp nào trong số này: Đối với các công cụ lưu trữ hỗ trợ kiểm soát đồng thời cấp tài liệu, chẳng hạn như Wiredtiger, việc mang lại là không cần thiết khi truy cập lưu trữ như các khóa ý định, được giữ ở cấp độ toàn cầu, cơ sở dữ liệu và thu thập, không chặn các độc giả và nhà văn khác. Tuy nhiên, các hoạt động sẽ định kỳ năng suất, chẳng hạn như:
Bảng sau liệt kê một số hoạt động và các loại khóa họ sử dụng cho các công cụ lưu trữ khóa cấp tài liệu:
Cập nhật dữ liệu Thực hiện tập hợp
Đã thay đổi trong phiên bản 4.0.
MongoDB 4.0.x và trước đó
Nếu không gian tên đích nằm trong một cơ sở dữ liệu khác như bộ sưu tập nguồn, lệnh Trước MongoDB 4.2, lệnh
Trước MongoDB 4.2, các hoạt động này đã khóa độc quyền trên cơ sở dữ liệu, chặn tất cả các hoạt động trên cơ sở dữ liệu và các bộ sưu tập của nó cho đến khi hoạt động hoàn tất. Các hoạt động MongoDB này có thể có được và giữ khóa trên nhiều cơ sở dữ liệu:
Đối với MongoDB 4.2.1 và sớm hơn, hoạt động này có được khóa độc quyền toàn cầu (W) khi đổi tên bộ sưu tập giữa cơ sở dữ liệu và chặn các hoạt động khác cho đến khi hoàn thành. Bắt đầu từ MongoDB 4.2.2, thao tác này chỉ có được khóa độc quyền (W) trên cơ sở dữ liệu đích, khóa được chia sẻ (r) có ý định trên cơ sở dữ liệu nguồn và khóa được chia sẻ trên bộ sưu tập nguồn thay vì độc quyền toàn cầu Khóa.locks. The operations on one Đối với MongoDB 4.2.1 và sớm hơn, hoạt động này có được khóa độc quyền toàn cầu (W) và chặn các hoạt động khác cho đến khi hoàn thành. Bắt đầu từ MongoDB 4.2.2, thao tác này chỉ có được khóa độc quyền (W) trên bộ sưu tập Sharding cải thiện sự đồng thời bằng cách phân phối các bộ sưu tập qua nhiều trường hợp Trong một cụm mảnh vỡ, các khóa áp dụng cho mỗi mảnh riêng lẻ, không phải cho toàn bộ cụm; tức là mỗi ví dụ Với các bộ bản sao, khi MongoDB viết cho một bộ sưu tập trên chính, MongoDB cũng viết vào oplog của chính, một bộ sưu tập đặc biệt trong cơ sở dữ liệu Tuy nhiên, đối với các tình huống yêu cầu tính nguyên tử của việc đọc và ghi vào nhiều tài liệu (trong một hoặc nhiều bộ sưu tập), MongoDB hỗ trợ các giao dịch đa tài liệu:
Quan trọngTrong hầu hết các trường hợp, giao dịch đa tài liệu phát sinh chi phí hiệu suất lớn hơn so với ghi tài liệu đơn lẻ và sự sẵn có của các giao dịch đa tài liệu không nên là một sự thay thế cho thiết kế lược đồ hiệu quả. Đối với nhiều kịch bản, mô hình dữ liệu được chuẩn hóa (tài liệu và mảng nhúng) sẽ tiếp tục tối ưu cho các trường hợp dữ liệu và sử dụng của bạn. Đó là, đối với nhiều kịch bản, mô hình hóa dữ liệu của bạn một cách thích hợp sẽ giảm thiểu nhu cầu cho các giao dịch đa tài liệu. Để biết các cân nhắc sử dụng giao dịch bổ sung (như giới hạn thời gian chạy và giới hạn kích thước oplog), xem thêm các cân nhắc sản xuất. Tùy thuộc vào mối quan tâm đọc, khách hàng có thể thấy kết quả ghi trước khi viết là bền. Để kiểm soát xem việc đọc dữ liệu có thể được quay lại hay không, khách hàng có thể sử dụng tùy chọn Mới trong phiên bản 5.0. Hoạt động đọc không khóa chạy ngay lập tức: nó không bị chặn khi một thao tác khác có khóa ghi độc quyền (x) trên bộ sưu tập. Bắt đầu từ MongoDB 5.0, các hoạt động đọc sau đây không bị chặn khi một thao tác khác giữ khóa ghi độc quyền (x) trên bộ sưu tập:
Khi viết vào một bộ sưu tập, Để biết thông tin, xem:
|