首先,这是 Pymongo Documentation
中的内容默认情况下,当线程首次在MongoDB上运行操作时,PyMongo会为每个线程启动一个请求。这可以保证 **读写一致性。在请求中,线程将继续独占使用相同的套接字,并且没有其他线程将使用此套接字,直到线程调用end_request()或它终止。此时,套接字将返回到连接池以供其他线程使用。
所以当使用异步库到Mongodb(比如Asyncmongo,Motor)时,用户是否会像阻塞调用或最终一致性那样具有一致性?
答案 0 :(得分:6)
关于这个问题有几点意见。
除非您在撰写时使用"safe=true"
,"w=1"
(或更高)或"j=true"
,否则无法保证具有读写后一致性。您可以将这些包含在insert()或update()
命令中,也可以使用set_lasterror_options()
为您正在使用的连接,数据库或集合设置这些选项。
如果您允许从辅助节点读取(例如,除了PRIMARY之外的ReadPreference),那么您将不会获得写后读写语义,而只会获得最终的一致性。
如果您使用的是PRIMARY的ReadPreference并且您正在设置相应的lasterror选项,那么您可以保证在使用相同套接字的所有操作上获得写后读写语义,即同一个帖子。
如果您正在使用多个线程,并且您没有从辅助节点读取,那么只要您在写入后在第二个线程中发出读取,就可以保证获得写后读写一致性在第一个帖子中完成。您可以使用标准线程同步原语来确保这一点。
答案 1 :(得分:3)
我是Motor的作者,我也对AsyncMongo有所了解。这是Motor关于安全写入的文档:
http://emptysquare.net/motor/pymongo/api/motor/differences.html#acknowledged-writes
简短回答:无论你在回调中执行什么代码来插入(),更新()等,如果这些插入或更新安全,都会看到MongoDB中的数据 已应用更改。您在此类回调中执行的任何代码都可能在MongoDB应用更改之前或之后运行。