Я знаю, как работает 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,
});
}
});
}
Является ли операция записи во втором коде атомарной? или я также должен использовать пересечение в операции записи облачной функции
Да, вы можете использовать транзакции как из клиента, так и из Cloud Functions.
Если вы обновляете одно и то же значение в Firestore как из клиента, так и из облачных функций, вам обязательно нужно использовать транзакции в обоих местах. Если облачная функция только добавляет данные, а прослушиватель срабатывает на клиенте, чтобы сообщить вам об этом, и сразу после этого вы используете транзакцию, вам не нужно использовать транзакцию в облачных функциях.
Пожалуйста, не могли бы вы взглянуть на мои правки.
Как было сказано ранее, если обе операции обновляют одно и то же поле isAcar
, да, вам также необходимо использовать транзакции в облачных функциях. И чтобы ответить на первый вопрос, транзакционные операции по определению атомарны.
спасибо, Алекс Мамо, я ценю это, но я до сих пор не понимаю, почему я должен использовать пересечение в облачной функции. Если в принципе нет необходимости писать операции в облачной функции, напишите ... потому что она записывает логические значения для того, кто сделал платный подписка, например, на firestore... Взамен пользователь проверяет, является ли его имя подписчиком или нет в firestore (часть пересечения — второй код). я не понимаю, почему мне нужно сделать пересечение и условие в части облачной функции
Если пользователь обновляет только ту информацию, которая принадлежит ему, и не может быть нескольких операций над одним и тем же полем и в одно и то же время, то я не вижу причин, почему вы вообще должны использовать транзакции в клиентском коде. . Кроме того, транзакции не работают в автономном режиме. Транзакции полезны в многопользовательской среде, когда несколько пользователей могут обновлять значение поля одновременно. Например, когда несколько пользователей могут обновить счетчик.
я вижу, чтобы упростить, вы можете представить, что облачная функция выполняет непрерывную запись в firestore в течение минуты (один раз true один раз false в секунду для isAcar Field). в то же время я помещаю результаты в одно и то же поле в разрезе в клиенте приложения. Будут ли все запросы атомарными в эту минуту? вот и все . и извините, что длинно. я только хочу понять этот момент
Если есть шанс, что функция (в течение этой минуты) может обновить значение поля в то же время, что и приложение, тогда вам придется использовать транзакции в обоих местах. В противном случае вы можете получить противоречивые данные.
спасибо большое месиво Алекс. теперь я понимаю. и должен ли я также использовать условие с пересечением? или просто transaction.update({isAcar:false}) (в части облачной функции)? потому что у меня нет необходимого условия там.
Если нечего проверять, то нет необходимости использовать оператор if. Вы можете обновить его напрямую.
''Вы можете обновить его напрямую'' .. например, transaction.update({isAcar:false}) . да?
Да точно, это правильно.
извините, что так долго, потому что у меня были некоторые проблемы со входом в систему, большое спасибо, Алекс Мамо .. я не знаю, что делать, если вы не предложили мне эту замечательную информацию .. теперь все идет нормально ♥
Спасибо . просто чтобы убедиться, что вы поняли, что я имел в виду, или нет. Я не использую Transection в части облачной функции, он только записывает напрямую в Firestore без каких-либо условий или пересечений. единственное место, где я использую пересечение, находится в приложении в соответствии с облачной функцией, записывающей значения в качестве условий. тот же ответ?