gpt4 book ai didi

javascript - 查找数据库相关问题

转载 作者:行者123 更新时间:2023-12-01 03:20:05 25 4
gpt4 key购买 nike

我一直在编写代码将积分从一个用户转移到另一个用户,我选择 MongoDB 作为数据库。但我被告知在transferCredits 函数中存在与数据库相关的问题。我一直在寻找,但没有发现任何问题。

function transferCredits(from, to, amt) {
var fromAccount = db.game_accounts.findOne({"name": from},{"credits": 1});
var toAccount = db.game_accounts.findOne({"name": to},{"credits": 1});
if (fromAccount.credits < amt) {
throw new BalanceError("not enough balance to transfer credits");
}
db.game_accounts.update({name: from}, {$set: {credits: fromAccount.credits - amt}});
db.game_accounts.update({name: to}, {$set: {credits: toAccount.credits + amt}});
}

db.game_accounts.insert({name: "John", credits: 1000});
db.game_accounts.insert({name: "Jane", credits: 1000});

// John transfers credits to Jane
transferCredits("John", "Jane", 100);

最佳答案

您没有告诉我们问题是什么,所以我们只能推测...

我发现这部分可能是错误的:

db.game_accounts.update({name: from}, {$set: {credits: fromAccount.credits - amt}});
db.game_accounts.update({name: to}, {$set: {credits: toAccount.credits + amt}});

这是因为 findOne()update() 之间可能发生另一个事务。您最好使用 $inc ,它将执行相同的操作,但不会让自己陷入竞争条件。

db.game_accounts.update({name: from}, {$inc: {credits: amt*-1}},function(err,res){
if (err) throw err;
db.game_accounts.update({name: to}, {$inc: {credits: amt}}, function(err,res){
if (err) throw err;
db.game_accounts.update({name: from}, {$inc: {credits: amt}});
});
});

请注意,要进行减法,我只需乘以 -1 即可将数字变为负数。

除此之外,如果用户尝试向其他用户提供 -10 积分,他将能够窃取 10 积分...需要像这样完成多个其他检查以确保交易有效。

顺便说一句,MongoDB 并不真正适合这种事务,您可能更喜欢使用另一种数据库,它可以确保数据是最新的并且所有操作都被跟踪和完成。

关于javascript - 查找数据库相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45279831/

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