在Mongodb中读取您自己的写入一致性

时间:2012-09-22 14:11:47

标签: mongodb asynchronous tornado pymongo eventual-consistency

首先,这是 Pymongo Documentation

中的内容
  

默认情况下,当线程首次在MongoDB上运行操作时,PyMongo会为每个线程启动一个请求。这可以保证 **读写一致性。在请求中,线程将继续独占使用相同的套接字,并且没有其他线程将使用此套接字,直到线程调用end_request()或它终止。此时,套接字将返回到连接池以供其他线程使用。

所以当使用异步库到Mongodb(比如Asyncmongo,Motor)时,用户是否会像阻塞调用或最终一致性那样具有一致性?

2 个答案:

答案 0 :(得分:6)

关于这个问题有几点意见。

  1. 除非您在撰写时使用"safe=true""w=1"(或更高)或"j=true",否则无法保证具有读写后一致性。您可以将这些包含在insert()或update()命令中,也可以使用set_lasterror_options()为您正在使用的连接,数据库或集合设置这些选项。

  2. 如果您允许从辅助节点读取(例如,除了PRIMARY之外的ReadPreference),那么您将不会获得写后读写语义,而只会获得最终的一致性。

  3. 如果您使用的是PRIMARY的ReadPreference并且您正在设置相应的lasterror选项,那么您可以保证在使用相同套接字的所有操作上获得写后读写语义,即同一个帖子。

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

答案 1 :(得分:3)

我是Motor的作者,我也对AsyncMongo有所了解。这是Motor关于安全写入的文档:

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

简短回答:无论你在回调中执行什么代码来插入(),更新()等,如果这些插入或更新安全,都会看到MongoDB中的数据 已应用更改。您在此类回调中执行的任何代码都可能在MongoDB应用更改之前或之后运行。