Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
Python 如何将pymongo收藏锁定到reading&;写作?_Python_Mongodb_Locking_Pymongo - Fatal编程技术网

Python 如何将pymongo收藏锁定到reading&;写作?

Python 如何将pymongo收藏锁定到reading&;写作?,python,mongodb,locking,pymongo,Python,Mongodb,Locking,Pymongo,我在docker容器上运行了一个mongo实例: docker run \ -d \ --name mongo \ -e MONGO_INITDB_ROOT_USERNAME=bla \ -e MONGO_INITDB_ROOT_PASSWORD=bla \ -p 27017:27017 \ mongo 我有一个流程,它以以下方式使用mongo: def init(): client = pymongo.MongoClient('mongodb://bla:bla@localhost:

我在docker容器上运行了一个mongo实例:

docker run \
-d \
--name mongo \
-e MONGO_INITDB_ROOT_USERNAME=bla \
-e MONGO_INITDB_ROOT_PASSWORD=bla \
-p 27017:27017 \
mongo
我有一个流程,它以以下方式使用mongo:

def init():
    client = pymongo.MongoClient('mongodb://bla:bla@localhost:27017')
    db = client['db']
    collection = db['col']
    collection.insert_one({'ok': False})
    return collection


def critical_section(collection):
    if list(collection.find({'ok': False})):
        # do stuff
        collection.update_one({'ok': False}, {'ok': True})


collection = init()
critical_section(collection)
我有许多并发进程运行
critical\u section
功能,因此我想在critical section之前锁定集合,然后解锁它(如果我不这样做,两个进程可以
找到一个文档,但是,第一个进程将设法更新,第二个进程将失败…)

我曾经锁定数据库:

collection = init()
pymongo.MongoClient('mongodb://bla:bla@localhost:27017')['admin'].command('fsync', lock=True)
critical_section(collection)
pymongo.MongoClient('mongodb://bla:bla@localhost:27017')['admin'].command('fsyncUnlock')
然而,这只会锁定写操作,这对我来说并没有什么好处

  • 我怎样才能同时锁定阅读
  • 我可以锁定集合而不是整个数据库吗
  • 我现在想我可以跳过查找,然后执行
    if collection.update_one().updated_count==1:#do stuff…
    ,尽管我不确定它是否解决了我需要的问题,因为如果没有
    find
    ,我无法知道我更新的项目的id
  • 有关示例实现,请参见

    我可以锁定集合而不是整个数据库吗

    试图通过锁定来解决并发问题(即使数据库不能被多个客户端使用)是次优的,因为它不能扩展,因此对于实际具有并发性的情况没有用处


    这就是为什么条件更新、MVCC/快照读取关注点和类似的构造提供原子性和一致性,但不锁定。

    我实际上用一个包装器包装了更新函数,给定修改的计数!=1引发了一个异常。我把它改了,现在我想我可以用了