.runTransaction(async transaction => {
const newContractUid = uuid();
const newContractRef = firestore
.collection(COLLECTION_CONTRACTS)
.doc(newContractUid);
const creatorRef = firestore.collection(COLLECTION_USERS).doc(creatorId);
const recipientRef = firestore
.collection(COLLECTION_USERS)
.doc(recipientId);
const [creator, recipient, newContractDoc] = [
await transaction.get(creatorRef),
await transaction.get(recipientRef),
await transaction.get(newContractRef)
];
if (newContractDoc.exists) {
console.warn("Attempted to create contract with already taked UUID");
return Promise.reject(
"Attempted to create contract with already taken UUID"
);
}
contractData.creationDate = Date.now().toString();
transaction.set(newContractRef, contractData);
// Update recipient and creator with contract relations
transaction.update(creatorRef, {
contracts: _.concat(creator.data().contracts, newContractUid)
});
transaction.update(recipientRef, {
contracts: _.concat(recipient.data().contracts, newContractUid)
});
})
У меня есть этот код, который создает новый контракт в моем пожарном депо.Затем он связывает этот контракт с двумя пользователями - создателем и получателем.
Однако меня беспокоит эта строка кода:
transaction.update(creatorRef, {
contracts: _.concat(creator.data().contracts, newContractUid)
});
Возможно ли другому пользователю записать в поле creator.data () во время транзакции и сделать недействительными мои данныеВот.Или у меня есть блокировка записи на время транзакции?
РЕДАКТИРОВАТЬ:
Хм, я вижу это в документации Firebase
Например, если транзакция читает документы и другой клиент изменяет любой из этих документов, Cloud Firestoreповторяет транзакциюЭта функция гарантирует, что транзакция выполняется с использованием актуальных и согласованных данных.
Я думаю, это означает, что в этом случае я в безопасности, но я не уверен