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

Abd*_* Pp 9 asynchronous tornado eventual-consistency mongodb pymongo

首先,这是Pymongo文档中的内容

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

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

Wil*_*m Z 6

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

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

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

  3. 如果您正在使用PRIMARY的ReadPreference并且您正在设置相应的lasterror选项,那么您将保证在使用相同套接字的所有操作(即相同的线程)上获得写后读写语义.

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

  • 对于Motor,您需要具有回调函数,并且一旦回调函数完成且没有错误,您将能够读取您编写的内容.参考:http://emptysquare.net/motor/pymongo/api/motor/differences.html#acknowledged-writes (2认同)