Одновременное обновление массива в firebase - PullRequest
0 голосов
/ 03 декабря 2018
.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повторяет транзакциюЭта функция гарантирует, что транзакция выполняется с использованием актуальных и согласованных данных.

Я думаю, это означает, что в этом случае я в безопасности, но я не уверен

1 Ответ

0 голосов
/ 03 декабря 2018

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

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