Firestore Избегайте двух запросов на один и тот же документ - PullRequest
0 голосов
/ 09 июля 2020

Разрабатываю приложение по реакции на лотереи. Имеется около 10к билетов с указанием документов. У них есть поле isAvailabe: true. Как это работает, когда пользователь запрашивает билет. Я запускаю запрос where (isAvailable == true) и устанавливаю ограничение на 1. Таким образом, я даю пользователю билет, а затем обновляю isAvailable: false. Моя проблема в том, что происходит, когда сотни пользователей запрашивают билет в один и тот же момент, что приводит к конфликтам. Я думал об использовании транзакций для решения этой проблемы, но все еще не уверен. Какой подход мне выбрать? Есть ли вариант лучше?

1 Ответ

1 голос
/ 09 июля 2020

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

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

Это именно тот сценарий, который у вас здесь, поэтому, как вы уже ожидали, вы должны использовать транзакция действительно.

Если у вас возникли проблемы при реализации этого, я рекомендую опубликовать новый вопрос с минимальным, полным / автономным кодом, который любой из нас может запустить, чтобы воспроизвести, где вы застряли .

...