Meteor.methods({ saveOnServer: function() { var totalCount = Collections.find({ "some": "condition" }).count(); if (totalCount) { var customerId = Collections.update('someId',{ "$addToSet": { objects: object } },function(err) { if (err) { throw err; } else { return true; } }); } else {} } });
我担心当2个客户端同时调用saveOnServer()时,它将为每个客户端返回相同的totalCount,并且基本上最终将相同的整数插入到对象id中.最终目标是在服务器端使用原子操作插入行,该操作仅在成功返回totalCount并且插入文档时才完成,确保不存在重复的ID?我试图不使用mongodb _id但是有我自己的整数递增id列.
我想知道如何确保每个插入操作的字段自动递增?我目前依赖于获取文件总数.这里有竞争条件吗?如果是这样,处理这个的流星方式是什么?
解决方法
方法在异步执行某些操作时会产生,实际上这意味着您在Meteor 0.6.5及更高版本中执行数据库更新或调用带回调的方法.由于您为更新调用提供了回调,Meteor将始终尝试在更新调用和更新的回调之间执行某些操作.但是,在Meteor 0.6.4.2及更早版本中,无论使用何种回调,数据库更新都是不可中断的.
但是,对saveOnServer的多次调用将按顺序发生,并且不会导致竞争条件.你可以调用this.unblock()来允许对saveOnServer的多次调用“同时” – 即,不共享不间断块的相同队列,标记为saveOnServer队列.
鉴于您拥有的代码,修改集合的另一种方法可以更改调用和更新之间count()的值.
您可以通过实现以下数据模型来阻止一种方法在中途使另一种方法无效:
saveOnServer : function () { // ... Collections.update({_id:someId,initialized:true,collectionCount: {$gt: 0}},{$addToSet: {objects: object}}); ///... }
将对象添加到集合时:
insertObject: function() { //... var count = Collections.find({some: condition}).count(); Collections.insert({_id:someId,initialized:false,collectionCount: count}); Collections.update({initialized:false},{$set:{initialized:true},$inc: {collectionCount: 1}}); }
请注意,虽然这可能看起来效率低下,但它反映了进行更新的确切成本,并且在不同方法中插入的行为与您的预期方式相同.在saveOnServer中,您无法插入.
相反,如果您从Collections.update中删除回调,它将同步发生,并且不会有比赛条件Meteor 0.6.5及更高版本.
原文地址:https://www.jb51.cc/js/158742.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。