Sebagai respons generik, komit multi-dokumen pada MongoDB dapat dilakukan sebagai komit dua fase, yang telah didokumentasikan secara luas dalam manual (Lihat:http://docs.mongodb.org/manual/tutorial/perform-two-phase- commit/).
Pola yang disarankan oleh manual secara singkat adalah sebagai berikut:
- Siapkan
transactions
terpisah koleksi, yang mencakup dokumen target , dokumen sumber , nilai dan status (dari transaksi) - Buat objek transaksi baru dengan
initial
sebagaistate
- Mulai melakukan transaksi dan perbarui
state
kepending
- Terapkan transaksi ke kedua dokumen (target, sumber)
- Perbarui status transaksi menjadi
committed
- Gunakan find untuk menentukan apakah dokumen mencerminkan status transaksi, jika ok, perbarui status transaksi menjadi
done
Selain itu:
- Anda perlu menangani skenario kegagalan secara manual (sesuatu tidak terjadi seperti yang dijelaskan di bawah)
- Anda perlu mengimplementasikan rollback secara manual, pada dasarnya dengan memperkenalkan nama
state
nilaicanceling
Beberapa catatan khusus untuk penerapan Anda:
- Saya tidak menyarankan Anda menambahkan bidang seperti
lock_status
,data_old
,data_new
ke dalam dokumen sumber/target. Ini harus menjadi properti dari transaksi, bukan dokumen itu sendiri. - Untuk menggeneralisasi konsep dokumen target/sumber, saya pikir Anda bisa menggunakan
DBref
s:http://www.mongodb.org/display/DOCS/Database+References - Saya tidak suka ide untuk menghapus dokumen transaksi jika sudah selesai. Menyetel status ke
done
sepertinya ide yang lebih baik karena ini memungkinkan Anda untuk men-debug nanti dan mencari tahu jenis transaksi apa yang telah dilakukan. Saya yakin Anda juga tidak akan kehabisan ruang disk (dan untuk ini juga ada solusinya). - Dalam model Anda, bagaimana Anda menjamin bahwa semuanya telah berubah seperti yang diharapkan? Apakah Anda memeriksa perubahannya?