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

在Mongodb中读取您自己的写入一致性,mongodb,asynchronous,tornado,pymongo,eventual-consistency,Mongodb,Asynchronous,Tornado,Pymongo,Eventual Consistency,首先,这里是在 默认情况下,PyMongo在每个线程第一次在MongoDB上运行操作时启动对该线程的请求。这保证了读写一致性。在一个请求中,线程将继续以独占方式使用同一套接字,并且在线程调用end_request()或终止之前,其他线程不会使用此套接字。此时,套接字将返回到连接池供其他线程使用 因此,在使用异步库进行Mongodb(如Asyncmongo、Motor)时,用户会像阻塞调用一样保持一致性还是最终保持一致性?关于这个问题有几点 除非您在写操作中使用了“safe=true”、“w=1”

首先,这里是在

默认情况下,PyMongo在每个线程第一次在MongoDB上运行操作时启动对该线程的请求。这保证了读写一致性。在一个请求中,线程将继续以独占方式使用同一套接字,并且在线程调用end_request()或终止之前,其他线程不会使用此套接字。此时,套接字将返回到连接池供其他线程使用


因此,在使用异步库进行Mongodb(如Asyncmongo、Motor)时,用户会像阻塞调用一样保持一致性还是最终保持一致性?

关于这个问题有几点

  • 除非您在写操作中使用了
    “safe=true”
    “w=1”
    (或更高版本)或
    “j=true”
    ,否则不能保证具有写后读一致性。您可以在insert()或
    update()
    命令中包含这些选项,或者使用
    set\u lasterror\u options()
    为正在使用的连接、数据库或集合设置这些选项

  • 如果您允许从辅助节点进行读取(例如,除主节点外的ReadPreference),那么您将不会获得写后读取语义,而只能获得最终一致性

  • 如果您使用的ReadPreference为PRIMARY,并且您正在设置适当的lasterror选项,那么您就可以保证在使用相同套接字(即相同线程)的所有操作上获得“先读后写”语义

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


  • 我是Motor的作者,对AsyncMongo也有一点了解。以下是有关安全写入的电机文件:


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

    我认为您给出了所有的可能性:我将MongoDB与tornado一起使用,而在tornado中,它是一个事件循环,因此获取线程很困难,那么异步库(不使用线程)呢。。。这取决于您使用的异步库。同样的规则也适用:只有在getLastError()命令成功返回后,才能保证读取您编写的内容。一旦从getLastError()成功返回,那么任何启动find()的线程都将看到写入的数据。线程之间的同步留给读者作为练习。我认为这是答案,因为它是以一般方式说的,所以我只想看看Motor或Asyncmongo是如何工作的:D谢谢你,Againor Motor,你需要一个回调函数,一旦回调函数无误地完成,您将能够读取您编写的内容。我开始学习异步调用,所以这就是为什么我问这个问题,给我更多的“能量”来学习它,你给了我很多:D再次感谢你谢谢你:D顺便说一句,Motor将使用所有pymongo查询,除了使用异步方式?正确,这就是目的。=)