Seperti yang Anda sebutkan saat ini tidak ada cara bersih untuk melakukan apa yang Anda inginkan. Pendekatan terbaik saat ini untuk operasi seperti yang Anda butuhkan adalah ini :
- Pembaca memilih X dokumen dengan batas dan pengurutan yang sesuai
- Pembaca menandai dokumen yang dikembalikan oleh 1) dengan ID pembaca uniknya sendiri (
e.g. update({_id:{$in:[<result set ids>]}, state:"available", $isolated:1}, {$set:{readerId:<your reader's ID>, state:"processing"}}, false, true)
) - Pembaca memilih semua dokumen yang ditandai sebagai pemrosesan dan dengan ID pembacanya sendiri. Pada titik ini, Anda dijamin memiliki akses eksklusif ke kumpulan dokumen yang dihasilkan.
- Tawarkan hasil dari 3) untuk diproses.
Perhatikan bahwa ini bahkan berfungsi dalam situasi yang sangat bersamaan karena pembaca tidak pernah dapat memesan dokumen yang belum dipesan oleh pembaca lain (perhatikan bahwa langkah 2 hanya dapat memesan dokumen yang tersedia saat ini, dan penulisan bersifat atomik). Saya akan menambahkan stempel waktu dengan waktu reservasi juga jika Anda ingin dapat mengatur waktu reservasi (misalnya untuk skenario di mana pembaca mungkin crash/gagal).
EDIT:Lebih detail:
Semua operasi tulis terkadang dapat menghasilkan operasi yang tertunda jika penulisan membutuhkan waktu yang relatif lama. Ini berarti bahwa langkah 2) mungkin tidak melihat semua dokumen yang ditandai dengan langkah 1) kecuali Anda melakukan langkah-langkah berikut :
- Gunakan nilai "w" (tulis kekhawatiran) yang sesuai, artinya 1 atau lebih tinggi. Ini akan memastikan bahwa koneksi tempat operasi tulis dipanggil akan menunggu hingga selesai, terlepas dari hasilnya.
- Pastikan Anda melakukan pembacaan pada langkah 2 pada koneksi yang sama (hanya relevan untuk replika dengan pembacaan yang diaktifkan slaveOk) atau utas sehingga dijamin berurutan. Yang pertama dapat dilakukan di sebagian besar driver dengan metode "requestStart" dan "requestDone" atau yang serupa (dokumentasi Java di sini
).
- Tambahkan flag $isolated ke multi-update Anda untuk memastikannya tidak dapat disisipkan dengan operasi tulis lainnya.
Lihat juga komentar untuk diskusi tentang atomisitas/isolasi. Saya salah berasumsi multi-pembaruan diisolasi. Mereka tidak, atau setidaknya tidak secara default.