Я работаю над приложением, которое постоянно принимает N первых пользователей и редактирует / перемещает их в другую «очередь» для обработки.
Я пытаюсь сделать это с помощью транзакции, чтобы не завершить один и тот же документ обрабатывается дважды путем одновременного редактирования, поскольку существуют параллельные сканеры.
Я не уверен, как добиться этого с помощью транзакции, поскольку, исходя из моего наивного понимания, транзакция, похоже, выполняется на docRef.
Пока что у меня есть код, аналогичный приведенному ниже, после этого SO thread , но я думаю, что это будет работать только для первого элемента, а не для второго? Другими словами, если do c обновляется другим пользователем процессора, он будет запущен повторно, но ничего не сделает, т.е. выберет следующих 2 основных пользователей, которые все еще не обработаны? Есть ли способ добиться этого? Я понимаю, что мне может понадобиться какой-то l oop здесь?
Возможно ли, что второе обновление do c будет atomi c, т.е. после первого обновления do c выберет другой одновременный пользователь вверх второй do c как верхний элемент?
var entriesRef = db.collection('entries');
var snapshot = entriesRef.where("status", "=", 'PENDING').orderBy("createTime").limit(2);
var docRefs = [];
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data());
docRefs.push(entriesRef.doc(doc.id));
});
let promise = await admin.firestore().runTransaction(transaction => {
var post = transaction.get(docRefs[0]);
var anotherPost = transaction.get(docRefs[1]);
if (post.status === 'PENDING' && anotherPost.status === 'PENDING') {
var newStatus = 'BEING PROCESSED'
await transaction.update(docRef[0], { status: newStatus });
await transaction.update(docRef[1], { status: newStatus });
}
});