Убедиться, что я обновляю обновленный документ в mongodb

Я создаю основанную на действии ролевую игру (не в реальном времени), где игрок может построить свой собственный город и переместить своего героя на карту тайлов.

Фон:

У меня есть такие коллекции:

  • плитки карты (каждая плитка имеет свой собственный документ),
  • герой (содержит статистику + ссылку на плитку карты - чтобы разместить ее на карте)
  • город (у каждого игрока есть свой город, в котором мы храним золото игрока).

Сценарий:

Чтобы переместить героя, я должен:

  • получить плитку карты назначения из коллекции, чтобы проверить занятость
  • получить героя из коллекции и проверить, находится ли он уже на плитке карты назначения
  • возьмите город из коллекции и проверьте, достаточно ли у игрока золота для перемещения

Затем:

  • вычесть золото для движения и сохранить городской документ
  • обновить героя новой плиткой карты и сохранить документ героя

Проблема:

Мое основное беспокойство по поводу всего процесса заключается в том, что город после нахождения и до вычитания золота может быть изменен другим действием (т. Е. Требовать действия по сбору золота, которое просто добавляет золото в город с помощью атомного $add в городском документе).

Конечно, некоторая блокировка запросов выполняется во внешнем интерфейсе, но игровой сервер просто api, поэтому каждый может запустить 20 одинаковых запросов одновременно и вызвать десинхронизацию данных. Есть ли что-нибудь, что можно сделать, или я сверхчувствительный?

Ps. Везде, где мы работаем над одним документом, мы используем update или findOneAndUpdate (с $set,$add и т. Д.), Чтобы исключить поиск, изменение записи в обратном вызове и затем сохранение.

0 ответов

Другие вопросы по тегам