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:https://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
transactionsriê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
initialdưới dạngstate - Bắt đầu thực hiện giao dịch và cập nhật
statetớ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
stategiá 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_newvà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
DBrefs:https://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
donecó 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?