Firebase Firestore - Как предотвратить одновременную запись? - PullRequest
0 голосов
/ 20 июня 2019

В настоящее время я работаю над приложением вопросов и ответов, для которого я использую firestore.

Текущий сценарий - один человек задаст вопрос.Этот вопрос соответствует нескольким людям.Однако только один из них может требовать ответа на этот вопрос.Когда человек заявляет вопрос, я изменяю статус в документе с вопросом с «ожидающий» на «заявленный».Чтобы два человека не задавали один и тот же вопрос, у меня есть логика в транзакции.Я обновляю документ только в том случае, если статус вопроса все еще находится в состоянии ожидания.

Текущая проблема - если два человека пытаются запросить этот вопрос одновременно, мое приложение вылетает с сообщением «Ошибка · Восстановление файла: операция была прервана, как правило, из-запроблема параллелизма, такая как прерывание транзакции и т. д. (firestore / aborted). '

Я не понимаю ошибки достаточно, чтобы решить эту проблему.Как мне решить эту проблему?

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

1 Ответ

0 голосов
/ 20 июня 2019

Я подозреваю, что следующий сценарий.

Персона A : успешно заявлен вопрос, транзакция завершена успешно.

Лицо B : невозможно запросить вопрос, ваш код (обратный вызов транзакции) заканчивается ошибкой. Это повторяется до пятикратного ограничения, но ваш код не справляется с этим должным образом и каждый раз дает сбой. После лимита 5 все обещание Транзакции возвращается с ошибочным ответом.

Чтобы исправить свой код, вы должны успешно завершить транзакцию для Лица B (без претензий), а затем проверить, успешно ли он / она задал вопрос. Он будет выполняться следующим образом:

Лицо A : успешно получает вопрос в 1 раунде транзакции

Персона B : теряет условие гонки в 1 раунде транзакции, транзакция выполняется во второй раз, потому что за это время произошла запись. Во втором раунде вы обнаруживаете, что он уже заявлен, и изящно завершаете транзакцию без претензий.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...