Я хочу выполнить транзакцию, которая требует обновления двух документов с использованием предыдущих значений этих документов.
Ради вопроса я пытаюсь передать 100 токенов от одного пользователя приложения другому.Эта операция должна быть атомарной, чтобы сохранить целостность данных моей БД, поэтому на стороне сервера я, хотя и использую admin.firestore().runTransaction
.
Как я понимаю, runTransaction
необходимо выполнить все чтения перед выполнением записи, так какмне прочитать оба баланса пользователя перед обновлением данных?
Это то, что у меня есть:
db = admin.firestore();
const user1Ref = db.collection('users').doc(user1Id);
const user2Ref = db.collection('users').doc(user2Id);
transaction = db.runTransaction(t => {
return t.get(user1Ref).then(user1Snap => {
const user1Balance = user1Snap.data().balance;
// Somehow get the second user's balance (user2Balance)
t.update(user1Ref , {balance: user1Balance - 100});
t.update(user2Ref , {balance: user2Balance + 100});
return Promise.resolve('Transferred 100 tokens from ' + user1Id + ' to ' + user2Id);
});
}).then(result => {
console.log('Transaction success', result);
});