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中的读写锁相关推荐

  1. golang中的读写锁

    简介 互斥锁本质是当一个协程访问的时候,其他协程都不能访问. 其实主要是想:修改数据要同步,这样其他协程才可以感知到,所以真正的互斥应该是读取和修改,修改和修改之间,读和读是没有互斥操作的必要的 读写 ...

  2. golang中关于读写锁、互斥锁的理解

    锁的概述 为了解决协程同步的问题我们使用了channel,但是GO也提供了传统的同步工具. 它们都在GO的标准库代码包sync和sync/atomic中. 下面我们看一下锁的应用. 什么是锁呢?就是某 ...

  3. Java中的读/写锁

    原文链接 作者:Jakob Jenkov 译者:微凉 校对:丁一 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些.假设你的程序中涉及到对一些共享资源的读和写操作,且写 ...

  4. go中的读写锁RWMutex

    转自:http://studygolang.com/articles/3027 读写锁是针对于读写操作的互斥锁. 基本遵循两大原则: 1.可以随便读.多个goroutin同时读. 2.写的时候,啥都不 ...

  5. Gox语言中使用读写锁解决并发冲突以及如何实现线程同步归并-GX22

    Gox语言中,除了可以直接使用Go语言中的通道对象(chan)之外,也直接引入了Go语言标准库中的sync包,因此可以直接使用共享锁Mutex对象或者读写锁RWMutex对象来处理并发操作中共享数据安 ...

  6. java 读写锁_Java中的读写锁

    一.读写锁 1.初识读写锁 a)Java中的锁--Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进 ...

  7. Mysql中的读写锁,表锁和行锁,间隙锁

    Mysql数据库锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的 ...

  8. ReentrantReadWriteLock读写锁及其在 RxCache 中的使用

    一. ReentrantReadWriteLock读写锁 Lock 是相当于 synchronized 更面向对象的同步方式,ReentrantLock 是 Lock 的实现. 本文要介绍的 Reen ...

  9. PHP程序中的文件锁、互斥锁、读写锁使用技巧解析

    文件锁全名叫 advisory file lock, 书中有提及. 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁. 这个锁可以防止 ...

最新文章

  1. 中科院遗传发育所白洋组项目聘用工作人员招聘启事
  2. python怎么识别拼音-Python 获取中文字拼音首个字母的方法
  3. 【今晚7点半】:华为云视频直播在各细分场景的体验指标优化实践
  4. 在Spring启动时与mongodb一起摇摆
  5. QT调用dll且进入DLL src code调试
  6. 字符串处理 —— 回文串相关
  7. 【BZOJ3489】A simple rmq problem kd-tree
  8. 查询中接受的主体参数_Apollo入门引导(三):编写查询解析器
  9. 像素生存者2为什么显示服务器不可用,像素生存者2为什么更新了玩不了 | 手游网游页游攻略大全...
  10. ASP.NET MVC3 异常处理 学习笔记
  11. 数字信号处理(matlab版)(第3版) pdf,数字信号处理-(第3版)-(MATLAB版)
  12. 【程序源代码】番茄时间小程序
  13. 老哥们着急求助一下:报错ORA-39083,ORA-00001
  14. 7-11 最长的单词
  15. As I Please--PartⅠ
  16. python的scrapy爬虫模块间进行传参_小猪的Python学习之旅 —— 4.Scrapy爬虫框架初体验...
  17. Mavlink协议概要
  18. Nginx学习 ---- js胖笔记
  19. 【精品盘点】2020年最受欢迎的6个知识库整理软件!
  20. Brendan Gregg ----Linux Performance Tools NEWS

热门文章

  1. Aooms_基于SpringCloud的微服务基础开发平台实战_002_工程构建
  2. Cacti+Nagios完全攻略(二)整合cacti与nagios安装部署
  3. 中国人工智能学会通讯——机器人组件技术在智能制造系统中的应用
  4. Docker 私有仓库最简便的搭建方法
  5. jenkins+svn搭建
  6. 如何理解delegate (委托)设计模式
  7. 【预告】这两天可能要装Server 2012 Essentials和Nginx反向代理
  8. 简单的ALV显示例子
  9. 根据id/类名/元素名称查找元素
  10. quartz定时定时任务执行两次