2013-04-20 3 views
2

Я выполняю транзакцию для обновления элемента, который нужно сохранить в двух ключах. Для достижения этой цели, я имею установку вложенную транзакцию следующим образом, и это, кажется, работает как ожидалось:Последствия вложенных транзакций в Firebase?

firebaseOOO.child('relationships/main').child(accountID).child(friendAccountID).transaction(function(data) { 
    data.prop = 'newval'; 
    firebaseOOO.child('relationships/main').child(friendAccountID).child(accountID).transaction(function(data) { 
     return r; 
    }); 
    return r; 
}); 

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

Есть ли лучший способ сделать это?

Я использую клиента NodeJS.

+0

Почему бы не попробовать обновление нескольких местоположений? https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html – Badie

ответ

4

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

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

+0

Хорошее решение, но это оставляет БД в несогласованном состоянии. Что делать, если кто-то читает данные, пока первая транзакция закончилась, а вторая еще не завершена ... Есть ли какое-либо решение, которое добавляет транзакцию к атомной функции функции updateChild. –

Смежные вопросы