Убедиться, что я обновляю обновленный документ в mongodb
Я создаю основанную на действии ролевую игру (не в реальном времени), где игрок может построить свой собственный город и переместить своего героя на карту тайлов.
Фон:
У меня есть такие коллекции:
- плитки карты (каждая плитка имеет свой собственный документ),
- герой (содержит статистику + ссылку на плитку карты - чтобы разместить ее на карте)
- город (у каждого игрока есть свой город, в котором мы храним золото игрока).
Сценарий:
Чтобы переместить героя, я должен:
- получить плитку карты назначения из коллекции, чтобы проверить занятость
- получить героя из коллекции и проверить, находится ли он уже на плитке карты назначения
- возьмите город из коллекции и проверьте, достаточно ли у игрока золота для перемещения
Затем:
- вычесть золото для движения и сохранить городской документ
- обновить героя новой плиткой карты и сохранить документ героя
Проблема:
Мое основное беспокойство по поводу всего процесса заключается в том, что город после нахождения и до вычитания золота может быть изменен другим действием (т. Е. Требовать действия по сбору золота, которое просто добавляет золото в город с помощью атомного $add в городском документе).
Конечно, некоторая блокировка запросов выполняется во внешнем интерфейсе, но игровой сервер просто api, поэтому каждый может запустить 20 одинаковых запросов одновременно и вызвать десинхронизацию данных. Есть ли что-нибудь, что можно сделать, или я сверхчувствительный?
Ps. Везде, где мы работаем над одним документом, мы используем update или findOneAndUpdate (с $set,$add и т. Д.), Чтобы исключить поиск, изменение записи в обратном вызове и затем сохранение.