Перемещение точек от пользователя к другому с использованием базы данных транзакций в реальном времени - PullRequest
0 голосов
/ 03 марта 2019

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

Мои данныеструктура:

{  
      uid-1:
             {
                points: 30
             },
        uid-2:
           {
              points:60
            }
}

Так что мне нужно две транзакции: одна вычитает uid-1, а вторая увеличивает uid-2

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

1 Ответ

0 голосов
/ 03 марта 2019

Не существует безопасного способа реализации условий между несколькими транзакциями.

Если обе операции зависят друг от друга, они должны выполняться как одна транзакция.Это означает, что у вас есть оптимистическая блокировка для всех «пользователей», но в вашей текущей структуре данных и необходимом решении.

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

ref = firebase.database().ref("users");
var updates = {};
let transactionID = ref.push().key;
updates["uid1/transactions/"+transactionID] =  20;
updates["uid2/transactions/"+transactionID] = -20;
ref.update(updates);

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

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