Jako obecnou odpověď lze vícedokumentové odevzdání na MongoDB provádět jako dvoufázové odevzdání, které bylo poněkud rozsáhle zdokumentováno v příručce (viz:http://docs.mongodb.org/manual/tutorial/perform-two-phase- se zavazuje/).
Vzor navržený v příručce je stručně následující:
- Nastavte samostatné
transactions
kolekce, která zahrnuje cílový dokument , zdrojový dokument , hodnota a stát (transakce) - Vytvořte nový objekt transakce s
initial
jakostate
- Začněte provádět transakci a aktualizujte
state
napending
- Použijte transakce na oba dokumenty (cíl, zdroj)
- Aktualizujte stav transakce na
committed
- K určení, zda dokumenty odrážejí stav transakce, použijte funkci find. Pokud je to v pořádku, aktualizujte stav transakce na
done
Navíc:
- Scénáře selhání musíte zpracovat ručně (něco se nestalo, jak je popsáno níže)
- Musíte ručně implementovat vrácení zpět, v podstatě zavedením názvu
state
hodnotacanceling
Některé konkrétní poznámky k vaší implementaci:
- Odradil bych vás od přidávání polí jako
lock_status
,data_old
,data_new
do zdrojových/cílových dokumentů. Měly by to být vlastnosti transakcí, nikoli samotné dokumenty. - Pro zobecnění konceptu cílových/zdrojových dokumentů si myslím, že byste mohli použít
DBref
s:http://www.mongodb.org/display/DOCS/Database+References - Nelíbí se mi myšlenka mazat transakční dokumenty, když jsou hotové. Nastavení stavu na
done
se zdá jako lepší nápad, protože vám to umožní později ladit a zjistit, jaké transakce byly provedeny. Jsem si docela jistý, že ani vám nedojde místo na disku (a i pro to existují řešení). - Jak ve svém modelu zaručíte, že se vše změnilo podle očekávání? Kontrolujete nějak změny?