node.js - 解析云代码 beforeSave 无法确保记录唯一
问题描述
Parse.Cloud.beforeSave("Attendance", function (request, response) {
var Attendance = Parse.Object.extend("Attendance");
var query = new Parse.Query(Attendance);
query.equalTo('user', { "__type": "Pointer", "className": "_User", "objectId": request.object.get("user").id });
query.equalTo('meeting', { "__type": "Pointer", "className": "Meeting", "objectId": request.object.get("meeting").id });
query.first({ useMasterKey: true }).then(function (result) {
if (result == undefined) {
console.log("!!!!!!!!! attendance creation approved for user id " + request.object.get("user").id + " and meeting id " + request.object.get("meeting").id)
response.success();
} else {
response.error("Attendance creation prevented because same attendance with same owner and meeting already exists")
}
}, function (err) {
console.error(err);
response.error(err);
return;
});
});
我有一个包含两列的出勤类:用户指针和会议指针。每个用户在一次会议中应该只有一个出席记录。因此,在 beforeSave 云代码触发器中,我进行了查询以查看是否存在现有的出勤记录。我认为这将防止重复的出勤记录。
但是当我们模拟大量并发请求时,例如在一个for循环中创建50个重复的考勤记录,我们仍然会看到大量的重复记录,比如33个重复记录。
这感觉像是一种竞赛条件。
我们如何才能真正防止这样的重复对象?
解决方案
我会在“出勤”集合中添加一个唯一索引。
db.collection.createIndex({'_p_user':1,'_p_meeting':1}, { unique: true } )
这样 mongo 处理唯一性并且不需要查询(将抛出错误 137)。
推荐阅读
- autodesk - 是否可以直接在bim360上集成一个forge项目?
- python - 在 Dask Array 中,块和块之间有什么区别吗?
- javascript - 我们如何在 ASP.Net 项目中包含 jQuery 库?
- c++ - 使用 QT 将一年中的某一天转换为日期
- macos - 无法并行启用 Coherence 模式 16
- android - 当我们再次启动视频时,是否有任何条款可以播放我们离开的 exoplayer 视频
- cmake - if 语句在 cmake 中使用宏
- javascript - React App JS - 如何引用静态 JSON 文件
- slurm - 指定用于 slurm 阵列作业的节点
- javascript - package.json 的位置