Python 如何将pymongo收藏锁定到reading&;写作?
我在docker容器上运行了一个mongo实例: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 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引发了一个异常。我把它改了,现在我想我可以用了