No. CouchDB sử dụng mô hình "đồng thời lạc quan". Trong điều kiện đơn giản nhất, điều này chỉ có nghĩa là bạn gửi một phiên bản tài liệu cùng với bản cập nhật của bạn và CouchDB từ chối thay đổi nếu phiên bản tài liệu hiện tại không khớp với những gì bạn đã gửi.
Thật đơn giản, thực sự. Bạn có thể định lại nhiều kịch bản giao dịch bình thường dựa trên CouchDB. Tuy nhiên, bạn cần phải loại bỏ kiến thức miền RDBMS của mình khi học CouchDB. Sẽ rất hữu ích khi tiếp cận các vấn đề từ cấp độ cao hơn, thay vì cố gắng đưa Couch vào một thế giới dựa trên SQL.
Theo dõi hàng tồn kho
Vấn đề bạn nêu chủ yếu là một vấn đề hàng tồn kho. Nếu bạn có một tài liệu mô tả một mục, và nó bao gồm một lĩnh vực cho "số lượng có sẵn", bạn có thể xử lý vấn đề đồng thời như thế này:
- Lấy tài liệu, hãy lưu ý những
_rev
tài sản đó CouchDB gửi cùng
- Decrement lĩnh vực số lượng, nếu nó lớn hơn không
- Gửi tài liệu được cập nhật trở lại, sử dụng tài sản
_rev
- Nếu
_rev
phù hợp với số lượng hiện lưu trữ, được thực hiện!
- Nếu có một cuộc xung đột (khi
_rev
không phù hợp), lấy phiên bản tài liệu mới nhất
Trong trường hợp này, có hai kịch bản thất bại có thể nghĩ đến. Nếu phiên bản tài liệu gần đây nhất có số lượng là 0, bạn xử lý nó giống như bạn làm trong RDBMS và cảnh báo người dùng rằng họ không thể mua những gì họ muốn mua. Nếu phiên bản tài liệu gần đây nhất có số lượng lớn hơn 0, bạn chỉ cần lặp lại thao tác với dữ liệu đã cập nhật và bắt đầu lại từ đầu. Điều này buộc bạn phải làm công việc nhiều hơn một chút so với RDBMS, và có thể hơi khó chịu nếu có những cập nhật mâu thuẫn thường xuyên.
Bây giờ, câu trả lời tôi vừa đưa ra giả định rằng bạn sẽ làm mọi thứ trong CouchDB theo cùng cách mà bạn sẽ làm trong RDBMS.Tôi có thể tiếp cận vấn đề này hơi khác:
Tôi bắt đầu với tài liệu "sản phẩm chính" bao gồm tất cả dữ liệu mô tả (tên, hình ảnh, mô tả, giá, v.v ...). Sau đó, tôi sẽ thêm tài liệu "vé khoảng không quảng cáo" cho từng trường hợp cụ thể, với các trường cho product_key
và claimed_by
. Nếu bạn đang bán một mô hình búa và có 20 mẫu để bán, bạn có thể có tài liệu có các phím như hammer-1
, hammer-2
, v.v., để đại diện cho mỗi cái búa có sẵn.
Sau đó, tôi sẽ tạo chế độ xem cung cấp cho tôi danh sách các búa có sẵn, với chức năng giảm cho phép tôi xem "tổng". Đây là hoàn toàn tắt cuff, nhưng nên cung cấp cho bạn một ý tưởng về một cái nhìn làm việc sẽ như thế nào.
Bản đồ
function(doc)
{
if (doc.type == 'inventory_ticket' && doc.claimed_by == null) {
emit(doc.product_key, { 'inventory_ticket' :doc.id, '_rev' : doc._rev });
}
}
này mang lại cho tôi một danh sách có sẵn "vé", bởi mã khóa sản phẩm. Tôi có thể lấy một nhóm này khi ai đó muốn mua một cái búa, sau đó lặp lại thông qua việc gửi các bản cập nhật (sử dụng id
và _rev
) cho đến khi tôi xác nhận thành công một (vé được xác nhận quyền sở hữu trước đó sẽ dẫn đến lỗi cập nhật).
Giảm
function (keys, values, combine) {
return values.length;
}
này làm giảm chức năng chỉ đơn giản trả về tổng số người nhận inventory_ticket
mục, vì vậy bạn có thể nói có bao nhiêu "búa" có sẵn để mua.
Hãy cẩn thận
Giải pháp này đại diện cho khoảng 3,5 phút trong tổng số suy nghĩ cho vấn đề cụ thể mà bạn đã trình bày. Có thể có cách tốt hơn để làm điều này! Điều đó nói rằng, nó làm giảm đáng kể các cập nhật xung đột và cắt giảm nhu cầu phản hồi xung đột với bản cập nhật mới. Trong mô hình này, bạn sẽ không có nhiều người dùng cố gắng thay đổi dữ liệu trong mục nhập sản phẩm chính. Ở mức rất tệ nhất, bạn sẽ có nhiều người dùng cố gắng yêu cầu một vé duy nhất và nếu bạn đã nắm lấy một số người trong số lượt xem của mình, bạn chỉ cần chuyển sang vé tiếp theo và thử lại.
Tham chiếu: https://wiki.apache.org/couchdb/Frequently_asked_questions#How_do_I_use_transactions_with_CouchDB.3F
Nó không rõ ràng với tôi như thế nào có 'vé' mà bạn cố gắng yêu cầu bồi thường theo thứ tự là một cải tiến đáng kể hơn chỉ đơn giản là thử lại đọc/sửa đổi/ghi để cập nhật thực thể chủ. Chắc chắn nó không có vẻ giá trị thêm chi phí, đặc biệt là nếu bạn có một lượng lớn cổ phiếu. –
Theo quan điểm của tôi, quy ước về vé là "đơn giản hơn" để xây dựng. Cập nhật không thành công trên mục nhập chính yêu cầu bạn phải tải lại tài liệu, thực hiện lại thao tác của bạn và sau đó lưu. Điều vé cho phép bạn thử và "yêu cầu" điều gì đó mà không phải yêu cầu thêm dữ liệu. – MrKurt
Ngoài ra, nó phụ thuộc vào loại phí mà bạn đang lo lắng.Bạn sẽ chiến đấu với sự tranh cãi gia tăng hoặc có thêm yêu cầu bộ nhớ. Cho rằng một vé cũng có thể tăng gấp đôi như một bản ghi mua hàng, tôi không biết rằng sẽ có nhiều vấn đề về lưu trữ như bạn nghĩ. – MrKurt