欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

MongoDB中的读写锁

发布时间:2025/6/17 编程问答 5 豆豆
生活随笔 收集整理的这篇文章主要介绍了 MongoDB中的读写锁 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1. MongoDB 使用的锁

MongoDB 使用的是“readers-writer”锁, 可以支持并发但有很大的局限性
当一个读锁存在,许多读操作可以使用这把锁,然而, 当一个写锁的存在,一个单一的写操作会”exclusively“持有该锁,同一时间其它写操作不能使用共享这个锁;
举个例子,假设一个集合里有10个文档,多个update操作不能并发在这个集合上,即使是更新不同的文档。


2. 锁的粒度

在 2.2 版本以前,mongod 只有全局锁(锁定一个server);
从2.2 版本开始,大部分读写操作只锁一个库(database),相对之前版本,这个粒度已经下降,例如如果一个 mongod 实例上有 5 个库,如果只对一个库中的一个集合执行写操作,那么在写操作过程中,这个库被锁;而其它 5 个库不影响。相比 RDBMS 来说,这个粒度已经算很大了!

更新:MongoDB 3.4版本,写操作的锁定粒度在表中数据记录(document)级别,即使操作对象可能是多条数据,每条数据在被写入时都会被锁定,防止其他进程写入;但是写操作是非事务性的,即写入多条数据,即使当前写入操作还没有完成,前面已经写入的数据也可以被其他进程修改。除非指定了$isolated,一次写入操作影响的数据无法在本次操作结束之前被其他进程修改。
$isolated也是非事务性的,即如果写入过程出错,已经完成的写入操作不会被rollback;另外,$isolated需要额外的锁,无法用于sharded方式部署的集群。

3. 如何查看锁的状态

db.serverStatus()
db.currentOp()
mongotop # 类似top命令,每秒刷新
mongostat
the MongoDB Monitoring Service (MMS)


4. 哪些操作会对数据库产生锁?

下表列出了常见数据库操作产生的锁。

操作锁定类型
查询读锁
通过cursor读取数据读锁
插入数据写锁
删除数据写锁
修改数据写锁
Map-reduce读写锁均有,除非指定为non-atomic,部分mapreduce任务可以同时执行(猜测是生成的中间表不冲突的情况下)
添加index通过前台API添加index,锁定数据库一段时间
db.eval()写锁,同时阻塞其他运行在MongoDB上的JavaScript进程
eval写锁,如果设定锁定选项是nolock,则不会有些锁,而且eval无法向数据库写入数据
aggregate()读锁

总结

以上是生活随笔为你收集整理的MongoDB中的读写锁的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。