Совместим ли метод Firebase Transactions со всеми операциями записи, включая операции записи облачных функций?

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

шаги

1- ниже приведена операция облачной функции, она записывает в Firstore (логическое значение) в isAcar field, а docUID — 123, в следующем напишите, мне все равно, какое условие напишите

  exports.onUserStatusChanged = functions.database.ref('/users/{uid}').onUpdate(
    async (change, context) => {
      const eventStatus = change.after.val();
      const userStatusFirestoreRef = firestore.doc(`users/${context.params.uid}`);
      return userStatusFirestoreRef.update(eventStatus);
  });

2- следующее находится в клиенте приложения

 myFunction(){
  DocumentReference doc = FirebaseFirestore.instance.collection("users").doc('123');
  FirebaseFirestore.instance.runTransaction((transaction) async {
    DocumentSnapshot docVal = await transaction.get(doc );
    if (docVal.get('isAcar ')==false) {
      transaction.update(doc ,{
    'isAcar ':true, 
  });
    }
  });
} 

Является ли операция записи во втором коде атомарной? или я также должен использовать пересечение в операции записи облачной функции

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, вы можете использовать транзакции как из клиента, так и из Cloud Functions.

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

Mohammed Hamdan 12.04.2023 11:30

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

Alex Mamo 12.04.2023 11:38

Пожалуйста, не могли бы вы взглянуть на мои правки.

Mohammed Hamdan 12.04.2023 12:05

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

Alex Mamo 12.04.2023 12:48

спасибо, Алекс Мамо, я ценю это, но я до сих пор не понимаю, почему я должен использовать пересечение в облачной функции. Если в принципе нет необходимости писать операции в облачной функции, напишите ... потому что она записывает логические значения для того, кто сделал платный подписка, например, на firestore... Взамен пользователь проверяет, является ли его имя подписчиком или нет в firestore (часть пересечения — второй код). я не понимаю, почему мне нужно сделать пересечение и условие в части облачной функции

Mohammed Hamdan 12.04.2023 13:07

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

Alex Mamo 12.04.2023 13:28

я вижу, чтобы упростить, вы можете представить, что облачная функция выполняет непрерывную запись в firestore в течение минуты (один раз true один раз false в секунду для isAcar Field). в то же время я помещаю результаты в одно и то же поле в разрезе в клиенте приложения. Будут ли все запросы атомарными в эту минуту? вот и все . и извините, что длинно. я только хочу понять этот момент

Mohammed Hamdan 12.04.2023 13:44

Если есть шанс, что функция (в течение этой минуты) может обновить значение поля в то же время, что и приложение, тогда вам придется использовать транзакции в обоих местах. В противном случае вы можете получить противоречивые данные.

Alex Mamo 12.04.2023 13:55

спасибо большое месиво Алекс. теперь я понимаю. и должен ли я также использовать условие с пересечением? или просто transaction.update({isAcar:false}) (в части облачной функции)? потому что у меня нет необходимого условия там.

Mohammed Hamdan 12.04.2023 14:14

Если нечего проверять, то нет необходимости использовать оператор if. Вы можете обновить его напрямую.

Alex Mamo 12.04.2023 20:36

''Вы можете обновить его напрямую'' .. например, transaction.update({isAcar:false}) . да?

Mohammed Hamdan 13.04.2023 01:56

Да точно, это правильно.

Alex Mamo 13.04.2023 07:26

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

Mohammed Hamdan 30.05.2023 18:01

Другие вопросы по теме