Като общ отговор, многодокументните ангажименти в MongoDB могат да се извършват като двуфазни комитации, които са донякъде подробно документирани в ръководството (Вижте:http://docs.mongodb.org/manual/tutorial/perform-two-phase- ангажира/).
Моделът, предложен от ръководството, е накратко следният:
- Настройте отделни
transactions
колекция, която включва целев документ , изходен документ , стойност и състояние (на сделката) - Създайте нов обект на транзакция с
initial
катоstate
- Започнете да извършвате транзакция и актуализирайте
state
доpending
- Прилагане на транзакции и към двата документа (цел, източник)
- Актуализиране на състоянието на транзакцията до
committed
- Използвайте find, за да определите дали документите отразяват състоянието на транзакцията, ако е добре, актуализирайте състоянието на транзакцията до
done
В допълнение:
- Трябва ръчно да обработвате сценарии на неуспех (нещо не се е случило, както е описано по-долу)
- Трябва ръчно да приложите връщане назад, основно чрез въвеждане на име
state
стойностcanceling
Някои конкретни бележки за вашата реализация:
- Бих ви разубедил да добавяте полета като
lock_status
,data_old
,data_new
в изходни/целеви документи. Това трябва да са свойства на сделките, а не самите документи. - За да обобщите концепцията за целеви/изходни документи, мисля, че бихте могли да използвате
DBref
s:http://www.mongodb.org/display/DOCS/Database+References - Не ми харесва идеята за изтриване на документи за транзакции, когато са готови. Задаване на състоянието на
done
изглежда като по-добра идея, тъй като това ви позволява по-късно да отстраните грешки и да разберете какъв вид транзакции са извършени. Почти съм сигурен, че няма да останете без дисково пространство (и за това има решения). - Как гарантирате във вашия модел, че всичко е променено според очакванията? Проверявате ли промените по някакъв начин?