gpt4 book ai didi

javascript - Firebase 事务会出错吗?

转载 作者:行者123 更新时间:2023-12-02 22:53:06 25 4
gpt4 key购买 nike

我有一个应用程序,允许用户每天投票 5 次。每张选票都被推送到 votes节点。我有一个 onCreate 云函数正在监听 votes启动多个事务,每个事务仅增加几个节点之一 tally/total , tally/users/{userId}

投票功能和onCreate已经过测试并按预期工作。

昨天我们部署到生产环境,我在 tally/users 上运行了查询看看是否有用户找到了一天投票超过 5 次的方法。当然,有两名用户在第一天就被标记为投票了 6 次。所以我对实际的 votes 进行了查询节点,发现这些用户实际上只提交了 5 票。所以...我的交易对于 5000 多个用户中的两个来说无法正常工作。

对于我们的例子,我们并不真的需要这些计数器非常准确,但是,这是怎么回事?我是否遗漏了有关 Firebase 交易的某些内容,或者它们真的不能指望吗? (双关语)

不要取笑我结构不良的数据库...

exports.allVotesOnCreate = functions.database
.ref('/votes/all/{pushId}')
.onCreate(
(snapshot, context) => {
const vote = snapshot.val();
const { date, userId, uid } = vote;

return Promise.all([
// removed other transactions for brevity
ref(`tally/all/total`)
.transaction(value =>
value ? value + 1 : 1
),
ref(`tally/user/byDate/${userId}/${date}`)
.transaction(value =>
value ? value + 1 : 1
),
]).catch(err => {
console.error(`Error tallying vote ${uid}`, err);
});
}
);

我预计votes中的票数对于特定日期的特定用户,将与 tally/user/byDate/{userId}/{date} 中的计数相匹配,但也有少数情况是实际得票数为5票,而得票数却是6票。

如果交易因某种原因失败,我什至可以预期计数可能会少于实际票数,但会更多吗?怎么办?

最佳答案

使用 Cloud Functions,如果系统中出现意外故障,一个事件可能会被多次传递。因此,您的函数应该期望每次数据库更改时可以多次调用您的函数句柄。这种情况很少见,但也是可能的。您可以(如果您愿意)检测这些重复的调用并进行适当的处​​理。

关于javascript - Firebase 事务会出错吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58106367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com