Недостатки использования транзакций в Google FireStore - PullRequest
0 голосов
/ 01 ноября 2019

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

await Firestore.instance.collection('user').document(id).updateData({'name': 'new name'});

await Firestore.instance.runTransaction((transaction) async {
      transaction.update(Firestore.instance.collection('user').document(id), {'name': 'new name'});
    });

Есть ли (существенные) недостатки у транзакций? Например, они дороже (биллинг Firebase, а не вычислительные)? В конце концов, в базе данных Firestore могут быть изменения, которые приведут к 5 повторным попыткам.

Для справки: https://firebase.google.com/docs/firestore/manage-data/transactions

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

https://codelabs.developers.google.com/codelabs/flutter-firebase/#10

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

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

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

Как правило, вам следуетСтарайтесь выполнять свою работу без транзакций, если это возможно. Например, предпочитайте использовать FieldValue.increment() вне транзакции вместо ручного увеличения внутри транзакции.

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

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

0 голосов
/ 01 ноября 2019

Есть ли (существенные) недостатки в транзакциях?

Я не знаю никаких недостатков.

Например, они дороже (Биллинг Firebase, не в вычислительном отношении)?

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

Я не уверен, что полностью понимаю ваш последний вопрос, но в случае сбоя транзакции Cloud Firestore повторяетсятранзакция точно.

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