Couchdb là giao dịch theo mặc định. Mọi tài liệu trong couchdb đều chứa _rev
Chìa khóa. Tất cả các cập nhật cho tài liệu được thực hiện dựa trên _rev
này khóa:-
- Nhận tài liệu.
- Gửi nó để cập nhật bằng thuộc tính _rev.
- Nếu cập nhật thành công thì bạn đã cập nhật _rev mới nhất của tài liệu
- Nếu cập nhật không thành công, tài liệu không phải là gần đây. Lặp lại các bước 1-3.
Xem câu trả lời này của MrKurt để được giải thích chi tiết hơn.
người nhận đi văng có một ví dụ về ngân hàng cho thấy các giao dịch được thực hiện như thế nào trong couchdb.
Và cũng có chuyển khoản ngân hàng nguyên tử này bài viết minh họa các giao dịch trong couchdb.
Dù sao thì chủ đề chung trong tất cả các liên kết này là nếu bạn làm theo mẫu couchdb cập nhật theo _rev
bạn không thể có trạng thái không nhất quán trong cơ sở dữ liệu của mình.
Tất cả các tài liệu couchdb là duy nhất kể từ _id
các trường trong hai tài liệu không được giống nhau. Xem xem sách nấu ăn
Chỉnh sửa dựa trên nhận xét
Bạn có thể sử dụng các tài liệu riêng biệt trong trường hợp này. Bạn chèn một tài liệu, chờ phản hồi thành công. Sau đó, thêm một tài liệu khác như
{_id:'some_id','count':1}
Với điều này, bạn có thể thiết lập một chế độ xem thu nhỏ bản đồ mà chỉ cần đếm kết quả của những tài liệu này và bạn có một bộ đếm cập nhật. Tất cả những gì bạn đang làm là thay vì cập nhật một tài liệu đơn lẻ để cập nhật, bạn đang chèn một tài liệu mới để phản ánh một lần chèn thành công.
Được rồi, tôi đã mô tả cách bạn có thể cập nhật các tài liệu riêng biệt nhưng ngay cả khi cập nhật một tài liệu duy nhất, bạn vẫn có thể tránh được sự mâu thuẫn nếu bạn:
- Chèn một tệp mới
- Khi couchdb đưa ra thông báo thành công -> cố gắng cập nhật bộ đếm.
Tại sao điều này hoạt động?
Điều này hoạt động vì khi bạn cố gắng cập nhật update document
bạn phải cung cấp _rev
sợi dây. Bạn có thể nghĩ đến _rev
như một trạng thái cục bộ cho tài liệu của bạn. Hãy xem xét tình huống này:-
- Bạn đọc tài liệu sẽ được cập nhật.
- Bạn thay đổi một số trường.
- Trong khi đó, một yêu cầu khác đã thay đổi tài liệu gốc. Điều này có nghĩa là tài liệu hiện có
_rev
mới - Nhưng Bạn yêu cầu couchdb cập nhật tài liệu bằng
_rev
đó làstale
mà bạn đã đọc ở bước # 1. - Couchdb sẽ tạo ra một ngoại lệ.
- Bạn đọc lại tài liệu để lấy
_rev
mới nhất và cố gắng cập nhật nó.
Vì vậy, nếu bạn làm điều này, bạn sẽ luôn phải cập nhật bản sửa đổi mới nhất của tài liệu. Tôi hy vọng điều này làm cho mọi thứ rõ ràng hơn một chút.
Lưu ý:
Như đã chỉ ra bởi Daniel, _rev
quy tắc không áp dụng cho cập nhật hàng loạt.