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