Jak jste zmínil, v současné době neexistuje žádný čistý způsob, jak dělat to, co chcete. Nejlepší přístup v tuto chvíli pro operace, jako je ten, který potřebujete, je tento:
- Aplikace Reader vybere X dokumentů s příslušným limitem a řazením
- Aplikace Reader označí dokumenty vrácené 1 svým vlastním jedinečným ID čtečky (
e.g. update({_id:{$in:[<result set ids>]}, state:"available", $isolated:1}, {$set:{readerId:<your reader's ID>, state:"processing"}}, false, true)
) - Aplikace Reader vybere všechny dokumenty označené jako zpracovávané a se svým vlastním ID čtečky. V tomto okamžiku je zaručeno, že máte výhradní přístup k výsledné sadě dokumentů.
- Nabídněte sadu výsledků z bodu 3) ke zpracování.
Všimněte si, že to funguje i ve vysoce souběžných situacích, protože čtenář si nikdy nemůže rezervovat dokumenty, které již nebyly rezervovány jiným čtenářem (všimněte si, že krok 2 může rezervovat pouze aktuálně dostupné dokumenty a zápisy jsou atomické). Přidal bych také časové razítko s časem rezervace, pokud chcete mít možnost vypršení časového limitu rezervací (například pro scénáře, kdy mohou čtečky selhat/selhat).
EDIT:Další podrobnosti:
Všechny operace zápisu mohou příležitostně přinést nevyřízené operace, pokud zápis trvá relativně dlouho. To znamená, že v kroku 2) se nemusí zobrazit všechny dokumenty označené krokem 1), pokud neprovedete následující kroky:
- Použijte vhodnou hodnotu „w“ (zájem o zápis), což znamená 1 nebo vyšší. To zajistí, že připojení, na kterém je vyvolána operace zápisu, bude čekat na její dokončení bez ohledu na to, zda se podvolí.
- Ujistěte se, že čtení v kroku 2 provádíte na stejném připojení (relevantní pouze pro replikasety s povoleným čtením slaveOk) nebo vláknu, aby bylo zaručeno, že budou sekvenční. První možnost lze ve většině ovladačů provést pomocí metod „requestStart“ a „requestDone“ nebo podobně (dokumentace Java zde
).
- Přidejte do více aktualizací příznak $isolated, abyste zajistili, že je nelze prokládat jinými operacemi zápisu.
Viz také komentáře k diskusi týkající se atomicity/izolace. Nesprávně jsem předpokládal, že vícenásobné aktualizace byly izolované. Nejsou, nebo alespoň ne ve výchozím nastavení.