深圳做网站要多少,专业的网页制作服务,福州网络推广专员,成都建筑设计公司排名转载自 Mongodb常见问题
一.数据库级锁
MongoDB的锁机制和一般关系数据库如 MySQL#xff08;InnoDB#xff09;, Oracle 有很大的差异#xff0c;InnoDB 和 Oracle 能提供行级粒度锁#xff0c;而 MongoDB 2.x 只能提供 库级粒度锁#xff0c;这意味着当 MongoDB 一个…转载自 Mongodb常见问题
一.数据库级锁
MongoDB的锁机制和一般关系数据库如 MySQLInnoDB, Oracle 有很大的差异InnoDB 和 Oracle 能提供行级粒度锁而 MongoDB 2.x 只能提供 库级粒度锁这意味着当 MongoDB 一个写锁处于占用状态时其它的读写操作都得干等。
MongoDB 使用的是“readers-writer”锁 可以支持并发但有很大的局限性当一个读锁存在,许多读操作可以使用这把锁然而, 当一个写锁的存在一个单一的写操作会 exclusively 持有该锁同时其它读写操作不能使用共享这个锁举个例子假设一个集合里有 10 个文档多个 update 操作不能并发在这个集合上即使是更新不同的文档。 初看起来库级锁在大并发环境下有严重的问题但是 MongoDB 依然能够保持大并发量和高性能这是因为 MongoDB 的锁粒度虽然很粗放但是在锁处理机制和关系数据库锁有很大差异主要表现在
MongoDB 没有完整事务支持操作原子性只到单个 document 级别所以通常操作粒度比较小 MongoDB 锁实际占用时间是内存数据计算和变更时间通常很快 MongoDB 锁有一种临时放弃机制当出现需要等待慢速 IO 读写数据时可以先临时放弃等 IO 完成之后再重新获取锁 在MongoDB 3.0版本中锁的粒度就变得更细了除了全局锁、数据库锁还加入了集合锁而且对于WiredTiger存储引擎和MMAPv1存储引擎而言两者之间的锁机制也有不同。 WiredTiger对于大部分的读写操作WiredTiger使用乐观锁。WiredTiger对于全局、数据库、集合级别只会使用意向锁。当存储引擎检测到两个操作之间的冲突一个写冲突导致MongoDB透明地重试写操作。一些全局操作跟2.2版本一样还是会需要全局锁例如删除一个集合那么仍然还是需要一个互斥的数据库锁的。 如何查看锁的状态
db.serverStatus() db.currentOp() mongotop mongostat
产生数据库锁的操作
操作 锁类型 Issue a query Read lock Get more data from a cursor Read lock Insert data Write lock Remove data Write lock Update data Write lock Map-reduce Read lock and write lock, unless operations are specified as non-atomic. Portions of map-reduce jobs can run concurrently. Create an index Building an index in the foreground, which is the default, locks the database for extended periods of time.
db.eval() Write lock.
二.原子操作但不支持事务
所谓原子操作就是要么对这个文档操作全部成功要么全部失败不会出现查询到的文档没有保存完整的情况 mongodb不支持事务所以在你的项目中应用时要注意这点。无论什么设计都不要要求mongodb保证数据的完整性。但是mongodb对单个文档的操作提供了许多原子操作比如文档的保存修改(包括对单个文档修改多个字段)删除等都是原子操作。
三.插入删除更新瞬时完成
插入删除更新都是瞬时完成的不需要等待数据库响应。这不属于异步操作发出指令后就不在操心之后的操作。客户端将文档发给服务器端就干别的去了不等待响应。
优点速度快缺点是操作发送到服务器之后不管后续服务器是否操作成功有可能丢数据日志用户点击或数据分析可以接受但付费系统不适合
安全性高的付费系统,可采用安全操作在执行完成之后需调用GETLastERROR检查执行是否成功然后抛出异常由前段进行处理
四.单个文件大小限制16M
习惯了使用mongodb中文档(document)存储方式, 可以灵活的将大量数据存入一个集合中的一条文档中, 这样可以减少大量的数据冗余, 不会出现关系性数据库, 如myslq中表的某一列的数据冗余. 不过这样存储虽好, 但其实也会存在一定的问题, 也就是mongodb中的大小限制, 即单个文档大小不能超过16M
对遇到过这个问题的人来说, 这个16M的概念很好理解, 而对于还未意识到这个问题的人来说, 这个坑 可能会让你花时间都难以发现, 因为这又要牵扯到mongodb的另一个存储机制 ---- 无返回码. 在 mongodb 权威指南 一书中, 作者称之为离弦之箭. 什么意思呢, 就是mongodb的插入,删除等操作, 客户端向数据库发出请求之后, 是不需要等待数据库返回操作是否成功的返回结果. 这也是mongodb插入,更新等操作速度快的原因. 这就导致, 当单个文件超过16M之后, 程序并不会报错, 但此时, 数据已经无法插入数据库了