Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB中的并发性_Mongodb_Concurrency_Pymongo_Mongodb Query - Fatal编程技术网

MongoDB中的并发性

MongoDB中的并发性,mongodb,concurrency,pymongo,mongodb-query,Mongodb,Concurrency,Pymongo,Mongodb Query,我将收集请求用作多个客户端并发读取的队列。每个客户端将从请求中一次读取一个文档,然后将其从集合中删除。我是否可以确保每个文档仅由一个客户端读取和处理 客户端是用pymongo用Python编写的。这里的基本过程是使用: 请原谅,这不是python代码,但结构是相同的,这是一个合理的通用示例。三份文件: {u id:1} {u id:2} {u id:3} 因此,从核心方法中,您只需在每个_id上使用remove参数调用它。没有其他进程可以同时执行此操作 db.collection.findAnd

我将收集请求用作多个客户端并发读取的队列。每个客户端将从请求中一次读取一个文档,然后将其从集合中删除。我是否可以确保每个文档仅由一个客户端读取和处理


客户端是用pymongo用Python编写的。

这里的基本过程是使用:

请原谅,这不是python代码,但结构是相同的,这是一个合理的通用示例。三份文件:

{u id:1} {u id:2} {u id:3} 因此,从核心方法中,您只需在每个_id上使用remove参数调用它。没有其他进程可以同时执行此操作

db.collection.findAndModify{ 查询:{u id:1}, 删除:true } 这将返回已删除的文档,或者根本不返回任何内容

为了更好地证明并发性,请再次原谅这里的node.js代码,但我不打算做一些briliant Twisted类型代码作为快速示例。它用于并发测试,但:

var async=require'async', 猫鼬=需要“猫鼬”, Schema=mongoose.Schema; var testSchema=新模式{ _身份证号码:, }; var Test=mongoose.model'Test',testSchema'Test'; 猫鼬,连接'mongodb://localhost/async'; 异步系列 [ //清除测试集合 函数回调{ Test.remove{},回调 }, //插入一些数据 函数回调{ async.each[1,2,3],functionnum,callback{ 创建{u id:num},回调; },回调; }, //现在并行运行测试 函数回调{ async.each[1,1,2,2,3,3],functionnum,callback{ Test.findOneAndRemove {u id:num}, 医生{ 如果出错,则调用backerr; console.log正在删除:%s,%s,num,doc; 回调; } ; },回调; } ], 函数器{ 过程。退出; } ; 结果可能会有不同的顺序:

正在删除:3,{u id:3,{u v:0} 正在删除:1,{u id:1,{u v:0} 删除:3,空 删除:1,空 正在删除:2,{u id:2,{u v:0} 删除:2,空 因此,在这里运行的六次尝试中,每个文档两次尝试,只有三次尝试实际成功并返回从堆栈中拉出的结果


这是确保你想要的结果的原则。

看起来像是你在寻找的

db.requests.findAndModify()
根据文档,如果您在主字段上使用一个唯一的索引,那么您应该在一个好地方结束


乐观锁定是目前唯一真正的方法way@Sammaye这可能是一种以DBA为中心的方法,但幸运的是MongoDB是在考虑程序员的情况下构建的,并且能够适应这种情况。@NeilLunn我感觉他过度简化了他的问题,特别是因为这是从queue@Sammaye我看不到在.findAndModify上有一个remove子句不适合这种情况。即使要求是更新而不是删除,如果要修改的标准是通过$ne等条件的一部分,另一个流程也不可能返回相同的文档。@NeilLunn application Failover这是一个很好的答案,谢谢。很容易在Python中应用。