Разница между транзакциями в firestore и FieldValue.increment при обновлении счетчика в firestore - PullRequest
1 голос
/ 18 июня 2019

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

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

  1. транзакции повторяются при аборте автоматически, хотя в документации нет упоминания о том, что FieldValue.increment () делает то же самое.
  2. , как указано в документации. МаксимумСкорость записи документа пожарного хранилища составляет одну запись в секунду, поэтому нельзя обновлять один счетчик более одного раза в секунду с помощью FieldValue.increment ().Но в документации не упоминается, что что происходит в этом случае? Например, если FieldValue.increment () вызывается дважды за одну секунду, второй вызов FieldValue.increment () завершается неудачно илион блокируется до тех пор, пока не пройдет одна секунда, а затем будет выполнена после того, как это произойдет, или произойдет что-то другое.
  3. Если две идентичные транзакции для обновления одного и того же счетчика будут выполняться двумя разными клиентами в одно и то же время,транзакций прерывается и повторяется?

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

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

1 Ответ

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

  2. В случае превышения лимита операция записи завершится неудачно, как и любая другая операция записи, превышающая предел. В этом нет ничего особенного в приращениях. Имейте в виду, что два быстрых изменения в документе не обязательно потерпят неудачу. Предел 1 изменения в секунду - это устойчивый предел. Система может обрабатывать несколько быстрых изменений за короткий период времени, но это не может продолжаться бесконечно. Опять же, это относится ко всем записям, а не только к приращениям.

  3. Нет, каждая транзакция будет отправляться независимо для создания. Не имеет значения, существуют ли какие-либо «идентичные» транзакции (каким бы образом вы это ни определили).

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

...