Vì một phản hồi chung, các cam kết đa tài liệu trên MongoDB có thể được thực hiện dưới dạng cam kết hai giai đoạn, đã được tài liệu rộng rãi trong sách hướng dẫn (Xem:http://docs.mongodb.org/manual/tutorial/perform-two-phase- cam kết /).
Mẫu được đề xuất bởi sách hướng dẫn ngắn gọn như sau:
- Thiết lập một
transactions
riêng biệt bộ sưu tập, bao gồm tài liệu đích , tài liệu nguồn , giá trị và trạng thái (của giao dịch) - Tạo đối tượng giao dịch mới với
initial
dưới dạngstate
- Bắt đầu thực hiện giao dịch và cập nhật
state
tớipending
- Áp dụng các giao dịch cho cả hai tài liệu (đích, nguồn)
- Cập nhật trạng thái giao dịch thành
committed
- Sử dụng find để xác định xem các tài liệu có phản ánh trạng thái giao dịch hay không, nếu ok, hãy cập nhật trạng thái giao dịch thành
done
Ngoài ra:
- Bạn cần phải xử lý các tình huống thất bại theo cách thủ công (điều gì đó không xảy ra như mô tả bên dưới)
- Bạn cần triển khai khôi phục theo cách thủ công, về cơ bản bằng cách đặt tên
state
giá trịcanceling
Một số lưu ý cụ thể để bạn triển khai:
- Tôi không khuyến khích bạn thêm các trường như
lock_status
,data_old
,data_new
vào tài liệu nguồn / đích. Đây phải là tài sản của các giao dịch, không phải là tài liệu. - Để khái quát khái niệm về tài liệu đích / nguồn, tôi nghĩ bạn có thể sử dụng
DBref
s:http://www.mongodb.org/display/DOCS/Database+Refferences - Tôi không thích ý tưởng xóa các tài liệu giao dịch khi chúng hoàn tất. Đặt trạng thái thành
done
có vẻ như là một ý tưởng tốt hơn vì điều này cho phép bạn gỡ lỗi sau đó và tìm ra loại giao dịch nào đã được thực hiện. Tôi khá chắc chắn rằng bạn cũng sẽ không hết dung lượng ổ đĩa (và vì điều này, cũng có các giải pháp). - Trong mô hình của bạn, làm thế nào để bạn đảm bảo rằng mọi thứ đã được thay đổi như mong đợi? Bạn có kiểm tra các thay đổi bằng cách nào đó không?