Итак, я сейчас запускаю несколько сценариев для сброса баланса пользователей в одном из наших приложений. Я использую Firestore, чтобы получить все задачи, а затем подсчитываю балансы, основанные на них для каждого из наших пользователей. Звучит просто, правда? Так должно быть, а его нет. Проблема в том, что транзакции прерываются из-за конфликтов записи в один и тот же документ. Это происходит потому, что все задачи передаются транзакции одновременно.
Я пытался использовать метод forEach, который вызывает их прерывание, потому что он пытается каждый раз обновлять одну и ту же запись пользователя.
И я попытался (пусть задача задач), который дает мне ошибку «не может выполнить задачи».
async function updatestuff(){
console.log("start");
const tasksRef = db.collection('tasks');
try {
const allTasksSnapShot = await tasksRef.get();
allTasksSnapShot.forEach(async(doc) => {
//Run transaction for calculations for each task here
const tskUser = doc.data().taskUser;
const tuser = db.collection('backupusers').doc(tskUser);
if(doc.data().taskStatus == 'Not Completed'){
console.log('NOT');}
if(doc.data().taskStatus != 'Not Completed'){
console.log('Run transaction here and wait for it to finish?');
await db.runTransaction(async t => {
const userSnapShot = await t.get(tuser);
if (!userSnapShot) {return console.log('not a thing')}
//get new balance calculated
const newBalance = userSnapShot.actualbalance + doc.data().taskBalanceAdj;
await t.update(tuser, {actualbalance: newBalance});
})
}});
console.log("end")
}
catch (err) {
console.log('Error getting documents', err);
}
}
В настоящее время конфликты между записями документов приводят к тому, что транзакции прерываются на полпути.
Я был бы очень признателен, если бы кто-нибудь помог мне в возможности передать каждую задачу в транзакцию асинхронным образом, ожидая завершения транзакции, а затем пропустив следующую задачу.
Или другой способ, который даст те же результаты ....
Заранее спасибо, добрая добрая добрая (ые) душа (и)!