11

首先,这是Pymongo 文档中所说的

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

因此,当对 Mongodb 使用异步库(如 Asyncmongo、Motor)时,用户是否会具有类似于阻塞调用或最终一致性的一致性?

4

2 回答 2

8

关于这个问题有几点。

  1. 除非您使用"safe=true", "w=1"(或更高版本)或"j=true"与您的 write 一起使用,否则不能保证您具有 read-after-write 一致性。您可以将这些作为 insert() 或update()命令的一部分包含在内,或者set_lasterror_options()用于为您正在使用的连接、数据库或集合设置这些选项。

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

  3. 如果您使用 PRIMARY 的 ReadPreference 并且您正在设置适当的 lasterror 选项,那么您可以保证在使用相同套接字(即相同线程)的所有操作上获得 read-after-write 语义。

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

于 2012-09-24T19:11:27.770 回答
3

我是 Motor 的作者,对 AsyncMongo 也略知一二。这是 Motor 关于安全写入的文档:

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

Short answer: Whatever code you execute in a callback to insert(), update(), etc., if those inserts or updates are safe, will see the data in MongoDB after the change has been applied. Any code you execute not in such a callback may run before or after MongoDB has applied the change.

于 2012-10-03T01:09:43.647 回答