Когда вы должны использовать транзакции Firebase

Я понимаю, что транзакции Firebase позволяют атомарное обновление некоторого значения, учитывая его старое значение и новое значение

Но учитывая, что Firebase является базой данных в реальном времени, я предполагаю, что транзакции следует использовать только экономно, а не в «функциях реального времени».

вот пример:

Я понимаю, что если вы выполняете некоторую математическую операцию со значением (добавляя «лайки» или эквивалент), имеет смысл использовать транзакцию

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

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

Ответы на вопрос(1)

Решение Вопроса

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

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

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

 Ced22 авг. 2017 г., 18:11
@FrankvanPuffelen не могли бы вы расширить << Для больших фрагментов данных, таких как ваш пример редактирования текста, использование транзакции будет плохо масштабироваться. >>. Почему это так?
 Frank van Puffelen23 авг. 2017 г., 00:22
Во многих случаях использования вероятность одновременной модификации возрастает с размером данных. А одновременная модификация приводит к конфликту (конфликтующие обновления), что приводит к повторным попыткам, что ограничивает параллелизм и, следовательно, масштабируемость.
 7hacker30 июн. 2016 г., 02:55
(продолжение) и есть ли вероятность повреждения в узле CommentLatest, если несколько клиентов обновляют узел commentLatest?
 Muhammad Hassan Nasr26 дек. 2016 г., 15:17
@FrankvanPuffelen Что я хочу обновить несколько путей в одной транзакции? Например, перевод денег с учетной записи пользователя на другую?
 7hacker30 июн. 2016 г., 02:54
Да, я не собираюсь использовать транзакции. вот пример. Предположим, система «Комментарий». Я могу пойти дальше и сохранить все комментарии в корневом узле «комментарии» с уникальной клавишей + некоторые атрибуты. Этот корень может стать большим, и если бы я хотел получить отсортированный список, я бы отправил запрос с некоторым параметром сортировки (на отметке времени). Если у меня есть другой узел: CommentLatest, в котором хранится уникальная кнопка последнего комментария. Таким образом, каждый клиент выполняет две записи: запись в дерево «Комментарий» с уникальной нажимной клавишей и обновление в комментирующее дерево с последней = уникальной нажимной клавишей, которую он только что использовал. Это масштаб?
 Frank van Puffelen30 июн. 2016 г., 03:17
Если вы беспокоитесь о несогласии с обновлениемlatestCommentId значение, вы можете оптимизировать преждевременно. Перезапись с более старой датой может быть предотвращена включением метки времени в качестве значенияlatestCommentId и затем отклонение метки времени старше, чем то, что в настоящее время там. Но обратите внимание, что мы перешли от невероятно широкого вопроса к очень подробному варианту использования. Возможно, вы захотите сначала потратить больше времени на работу с транзакциями Firebase, а затем задать более конкретный вопрос с кодом и правилами безопасности.

Ваш ответ на вопрос