2012-09-22 45 views
9

第一,这里什么是 Pymongo DocumentationMongoDB中读你自己的写入数据的一致性

默认情况下说,PyMongo当线程首先运行于MongoDB的动作开始为每个线程的请求。这保证了**读写一致性。在请求中,线程将继续独占使用同一套接字,并且在线程调用end_request()或终止之前,其他线程不会使用此套接字。此时,套接字返回到连接池供其他线程使用。

因此,当使用Mongodb的异步库(如Asyncmongo,Motor)时,用户是否具有阻止调用或最终一致性的一致性?

回答

6

对这个问题有几点看法。

  1. 你不能保证已读后写的,除非你使用的一致性或者"safe=true""w=1"(或更高版本)或"j=true"你写。您可以将它们作为insert()或update()命令的一部分,或者使用set_lasterror_options()为您正在使用的连接,数据库或集合设置这些选项。

  2. 如果您允许从辅助节点读取数据(例如PRIMARY以外的ReadPreference),那么您将无法获得写后读语义,而只能获得最终一致性。

  3. 如果您正在使用PRIMARY的ReadPreference和你设置适当的lasterror选项,那么你保证得到在使用相同套接字的所有操作读 - 写后的语义,也就是说,相同线。

  4. 如果您正在使用多个线程,并且您没有从辅助节点读取数据,那么只要您在写入完成后在第二个线程中发出读取操作,就可以保证读取后写入一致性在第一个线程中。您可以使用标准线程同步原语来确保这一点。

+0

我以为你给所有的可能性:d 正在使用与龙卷风的MongoDB,并在龙卷风它是一个事件循环,所以这是一个艰难的方式来获得线程,所以怎么样的非同步库(即不使用线程) –

+1

呃...这取决于你使用的异步库。相同的规则适用:只有getLastError()命令成功返回时,才能保证读取所写的内容。一旦你从getLastError()获得了成功的返回,那么任何启动find()的线程都将看到写入的数据。线程之间的同步作为读者的练习。 –

+0

我认为这是答案,因为它是以一般方式发言,所以我只能看到Motor或Asyncmongo的工作原理:D 再次感谢您 –

3

我是Motor的作者,我也对AsyncMongo有所了解。下面是汽车的有关安全写入文件:

http://emptysquare.net/motor/pymongo/api/motor/differences.html#acknowledged-writes

简短的回答:你在回调中执行任何代码插入(),更新(),等等,如果这些插入或更新安全,会看到MongoDB 中的数据在之后发生了变化。您在这种回调中执行的任何代码都可能在MongoDB应用更改之前或之后运行。

+0

谢谢:顺便说一句,Motor除了使用异步的方式外,还会使用所有的pymongo查询? –

+1

正确,就是这个意思。 =) –

+0

,我喜欢这个意图;) –