2013-03-23 81 views
0

MoongoDB来自NoSql时代,Lock是与RDBMS相关的东西吗? from Wikipedia为什么在MongoDB中使用锁定?

乐观并发控制(OCC)是关系数据库管理系统并发控制方法......

那么,为什么我在PyMongo is_locked发现,甚至在驾驶员使非阻塞呼叫,锁定仍然存在,电机有is_locked

回答

1

MongoDB实现了一个数据库级锁定系统。这意味着非原子操作将锁定在每个数据库级别,与SQL不同,因为大多数技术都锁定在表级别上进行基本操作。

就地更新只发生在某些运营商 - $set是其中之一,MongoDB文档曾经有一个页面显示所有这些页面,但我现在找不到它。

MongoDB当前实现读/写锁,每个锁都是分开的,但它们可以互相阻塞。

锁对于任何数据库都是至关重要的,例如,如果当前正在写入文档,如何确保文档的一致性读取?如果您写入文档,您如何确保您只同时应用该单一更新,而不是同时进行多个更新?

我不确定版本控制如何在CouchDB中阻止这种情况,对于一致的读取来说锁确实非常重要,并且与版本控制是分开的,即如果您希望将读锁应用于同一版本或读取文档目前正在写入新版本?您将很明显看到锁定队列出现。尽管版本控制可能对写入锁定饱和有所帮助,但仍然会有写入锁定,并且仍然需要在一个级别上工作。

至于并发功能;如果数据不在RAM中,MongoDB有能力支持其他操作。这意味着锁不会等待数据被分页,其他操作将同时运行。

作为一个方面说明,MongoDB实际上拥有比这更多的锁,它也有一个全局和阻塞的JavaScript锁,它没有普通锁的正常并发特性。

,甚至在驾驶,使非阻塞调用

嗯,我想你可能会被什么意思为“非阻塞”应用程序或服务器相混淆:http://en.wikipedia.org/wiki/Non-blocking_algorithm

+0

sorry但是我不关注你在非阻塞和锁定数据库中,当数据库锁定自身时,非阻塞是无用的吗? – 2013-03-24 00:12:30

+1

@AbdelouahabPp非阻塞是应用程序/服务器的一个功能,它不是无用的,因为它关心应用程序如何运行以及它如何处理自己的数据。嗯,想象两个PHP进程争夺同一个脚本,尽管你没有看到它,但是在启动已经运行的新脚本时存在轻微的“锁定”延迟,在非阻塞应用程序中,这不会例如 – Sammaye 2013-03-24 03:33:08

+0

所以我想,如果process1试图做一个数据库调用,并发现mongodb锁定,它立即说这样的话:嘿,process2,现在轮到你试试了吗? – 2013-03-24 13:41:39

2

NoSQL并不意味着自动没有锁。 总是有一些操作需要锁定。

对于指数的例子建设

和官方MongoDB的文档,然后更可靠的来源维基百科(没有冒犯的意思维基百科:))

http://docs.mongodb.org/manual/faq/concurrency/

+0

似乎复制品会变得更复杂! RDBMS中的 – 2013-03-23 00:31:37

+0

一致性由锁管理,因此这里的一致性仅适用于索引? – 2013-03-23 00:37:34

+0

即使在NoSql中也存在乐观和悲观并发感,但每个DBMS都有自己的策略 – 2013-03-23 00:54:04

2

蒙戈确实就地更新,所以它需要锁定才能修改数据库。还有其他需要锁定的东西,所以请阅读@Tigra提供的链接以获取更多信息。

就数据库而言,这是非常标准的,它不是一个RDBMS特定的事情(Redis也是这样做的,但是基于每个密钥)。

有实现收藏级(而不是数据库级)锁定计划:https://jira.mongodb.org/browse/SERVER-1240

有些数据库,像CouchDB中,仅追加新的文件得到解决锁定问题。他们创建一个新的唯一版本ID,一旦文档写完,数据库就指向新版本。我确信在更改使用哪个修订版本时会有某种并发控制,但它不需要阻止数据库来执行此操作。这有一些缺点,例如compaction需要定期运行。

+0

因此每个DBMS都有自己的技术来减少锁? – 2013-03-23 00:30:28

+1

@AbdelouahabPp - 我不是数据库专家,但它似乎取决于数据库是如何实现的。锁定通常是一种折衷,以保证更快的查询速度(慢速写入与慢速读取)。请访问http://dba.stackexchange.com获取专家意见。 – tjameson 2013-03-23 00:40:32

相关问题