Атомное обновление с использованием транзакции в Firebase Android - PullRequest
0 голосов
/ 09 сентября 2018

Я хочу создать простое приложение для создания матчей, используя android и firebase. Работа заключается в следующем Пользователь A подключается к сети, а узел создается на базе Firebase. Пользователь B подключается к сети, и второй узел создается на базе FireBase. и так далее. Объектами UserA и UserB являются enter image description here

Теперь я хочу обновить UserA с полями userB и userB с полями UserA. Обеспечение того, чтобы ни один другой пользователь не прерывал это обновление. лайк enter image description here

Я попытался использовать транзакцию и обнаружил, что с помощью транзакции можно изменить только одну ссылку на базу данных. Есть ли способ, с помощью которого я могу обновить обоих пользователей одновременно, используя транзакцию и гарантируя, что обе ссылки будут либо обновлены, либо сбой в одно и то же время (между ними нет. Один обновлен, а другой нет)

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

EDIT-1 Я перешел в Firebase Fire Store и пока попробовал приведенный ниже код с функциями Firebase. Не уверен, что он будет служить цели, когда база пользователей увеличивается.

function matchedUser(xSnapshot, mSnapshot) {

return db.runTransaction(t => {
    console.log(mSnapshot.mUserId)
    console.log(xSnapshot.mUserId)

    console.log("Other Snap ID" + otherSnapshot.mUserId)
    console.log("My Snap ID" + mySnapshot.mUserId)
    const xUserRef = db.collection("Users").doc(otherSnapshot.mUserId)
    return t.get(xUserRef).then(doc => {
      t.update(xUserRef, otherSnapshot)
      const mUserRef = db.collection("Users").doc(mySnapshot.mUserId)
      t.update(mUserRef, mySnapshot)
    }).catch(error => {
      console.log(error)
    })
  })
    .then(result => {
      console.info('Transaction success!')
      return "Success"
    })
    .catch(err => {
      console.error('Transaction failure:', err)
      return "Failed"
    })
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...