Firebase не позволяет нескольким пользователям получать один и тот же элемент

У меня есть этот узел items:

items
|
|----item_id_1
     -name:
     -type:
     -price:

Идея в том, что когда один пользователь получает предмет, происходят 2 вещи:

  1. Элемент удаляется из узла items.
  2. Элемент добавляется в его/ее узел my_items.

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


Проблема:

Если несколько пользователей запросили элемент одновременно, как мне определить, куда этот элемент будет отправлен?

Вопрос:

  1. Как сделать так, чтобы если несколько пользователей запросили предмет одновременно, его получил только один (никто другой)?

  2. Способны ли правила безопасности решить эту проблему?

  3. Я знаю об операциях Firebase Transaction, но не уверен, помогут ли они в моем случае.

Любые советы приветствуются.

Спасибо.

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

Data overflow 10.01.2023 17:34

@Mises Я имею в виду, когда пользователь получает элемент, этот элемент должен быть удален из items, а элемент должен быть добавлен в my_items, это обновление с несколькими путями, и я не думаю, что транзакция здесь полезна.

Data overflow 10.01.2023 21:39

Я был бы рад видеть, как ваши пользователи пытаются щелкнуть элемент, чтобы получить его, а элемент исчезает за миллисекунды, и они нажимают на совершенно другой элемент. МАГИЯ XD

Mises 10.01.2023 23:26
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
1
3
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Я знаю об операциях Firebase Transaction, но не уверен, помогут ли они в моем случае.

Когда дело доходит до обновления местоположения базы данных реального времени (узла) в многопользовательской среде, действительно требуется транзакция. Однако транзакция может читать и обновлять только одно местоположение (узел). Вы не можете выполнять транзакции в нескольких местах. С другой стороны, Firestore делает:

Используя клиентские библиотеки Cloud Firestore, вы можете сгруппировать несколько операций в одну транзакцию.

Поэтому при использовании Firestore вы можете обновлять документы независимо от того, существуют ли они в коллекции или подколлекции. В базе данных реального времени вы можете безопасно обновлять дочерние элементы только в том месте (узле), которое вы используете для транзакции.

Способны ли правила безопасности решить эту проблему?

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

Не могли бы вы дать мне представление о том, как будет выглядеть правило безопасности в моем случае? Большое спасибо за ваше время.

Data overflow 11.01.2023 14:17

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

Alex Mamo 11.01.2023 14:27

Как вы думаете, может быть, я могу обновить этот вопрос, чтобы не повторять вопрос?

Data overflow 11.01.2023 14:31

Нет, дополнительный вопрос — это просто новый пост.

Alex Mamo 11.01.2023 14:34

Хорошо, тогда просто чтобы убедиться. Итак, что вы предложили в своем ответе, так это то, что для случая с базой данных в реальном времени мне нужно будет выполнить обновление нескольких местоположений для моих двух узлов items и my_items и защитить оба узла с помощью Security-Rules, чтобы только один пользователь получил элемент, даже если много нажали одновременно?

Data overflow 11.01.2023 14:38

Я бы проголосовал, но у меня недостаточно репутации. Спасибо за вашу помощь и за ваше время.

Data overflow 11.01.2023 15:09

Да, это в значительной степени то, что говорит связанный ответ. Всегда пожалуйста.

Alex Mamo 11.01.2023 15:15

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

Data overflow 13.01.2023 02:34

Я посмотрю и если узнаю ответ, то напишу вам.

Alex Mamo 13.01.2023 07:09

Спасибо, Алекс, и если вы хотите, чтобы я что-то обновил в другом вопросе или что-то неясно, дайте мне знать.

Data overflow 13.01.2023 13:23

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