我有一个“单词”表,我想做的是,如果用户使用该单词,则将其插入表中。但是,如果它已经存在,请更新该单词的计数。
我看不到将列实际设置为唯一的方法。也就是说,我如何避免竞争条件:
t1 - user1 检查是否使用了“Love”。NO t2 - user2 检查是否使用了“Love”。NO t3 - user1 添加“Love” t4 - user2 添加“Love”
我不希望它在数据库中出现两次。无论如何要在 Parse 中完成这个?
我有一个“单词”表,我想做的是,如果用户使用该单词,则将其插入表中。但是,如果它已经存在,请更新该单词的计数。
我看不到将列实际设置为唯一的方法。也就是说,我如何避免竞争条件:
t1 - user1 检查是否使用了“Love”。NO t2 - user2 检查是否使用了“Love”。NO t3 - user1 添加“Love” t4 - user2 添加“Love”
我不希望它在数据库中出现两次。无论如何要在 Parse 中完成这个?
为避免竞争条件,您应该使列/字段唯一。在与 Parse 一起使用的数据库中执行此操作(如果您将 mongoDB 与解析服务器一起使用,那么这里是 mongoDB 的链接,例如 - https://docs.mongodb.com/manual/core/index-unique/)。然后在 CloudCode 中 - 尝试创建一个新的单词对象并存储它。如果单词已经存在,则存储将失败,然后您可以使用查询来查找现有单词并改为递增。
您可以使用“存在”查询来检查具有键集的对象:
var Word = Parse.Object.extend("words");
var query = new Parse.Query(Word);
query.exists("Love");
query.find({
success: function(results) {
if(results.length === 0){
// Insert a new word object with the 'Love' key set to 1
var newWord = new Word();
newWord.set('Love', 1);
newWord.save(null, {
success: function(newWord) {
alert('New object created with objectId: ' + newWord.id);
},
error: function(newWord, error) {
alert('Failed to create new object, with error code: ' + error.description);
}
});
} else {
// Get the existing word object and increment its 'Love' key by 1
var existingWord = results[0];
var currCount = existingWord.get('Love');
existingWord.set('Love', currCount + 1);
existingWord.save(null, {
success: function(existingWord) {
alert('Existing object saved with objectId: ' + newWord.id);
},
error: function(existingWord, error) {
alert('Failed to save existing object, with error code: ' + error.description);
}
});
}
},
error: function(error) {
alert("Error: " + error.code + " " + error.message);
}
});
关于防止竞争条件,您可以使用Parse Cloud Code处理此问题。你可以有一个处理数据输入的云函数,它应该按顺序处理请求。