Поведение блокировки транзакции при несуществовании документов - PullRequest
0 голосов
/ 12 октября 2019

Транзакции Firestore удерживают пессимистическую блокировку прочитанных в ней документов. Применяется ли эта блокировка, даже если документ не существует?

По примеру из nodejs docs :

firestore.runTransaction(transaction => {
  let documentRef = firestore.doc('col/doc');
  return transaction.get(documentRef).then(doc => {
    if (doc.exists) {
      transaction.update(documentRef, { count: doc.get('count') + 1 });
    } else {
      transaction.create(documentRef, { count: 1 });
    }
  });
});

Если две транзакции читают и изменяют одно и то женесуществующий doc col/doc произойдет ли сбой одного из них и попытка повторного запуска?

Также метод create имеет свое собственное поведение при сбое - «Операция не выполнит транзакцию, если документ существует в указанном месте.». Безопасно ли использование create по сравнению с set + merge в этом контексте?

1 Ответ

1 голос
/ 12 октября 2019

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

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

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