首先,这是Pymongo 文档 http://api.mongodb.org/python/current/examples/requests.html?highlight=read%20you%20own%20write
默认情况下,当线程首次在 MongoDB 上运行操作时,PyMongo 会为每个线程启动一个请求。这保证了**读你所写的一致性。在请求中,线程将继续独占使用同一个套接字,并且其他线程不会使用此套接字,直到线程调用 end_request() 或终止。此时,套接字将返回到连接池以供其他线程使用。
那么当使用 Mongodb 的异步库(如 Asyncmongo、Motor)时,用户会获得像阻塞调用那样的一致性还是最终一致性呢?
关于这个问题有几点。
除非您使用其中之一,否则不能保证具有写后读一致性"safe=true"
, "w=1"
(或更大)或"j=true"
与你的写作。您可以将它们包含在 insert() 中,或者update()
命令,或者使用set_lasterror_options()
为您正在使用的连接、数据库或集合设置这些选项。
如果您允许从辅助节点读取(例如,除 PRIMARY 之外的 ReadPreference),那么您将不会获得先写语义,而只能获得最终一致性。
如果您使用 PRIMARY 的 ReadPreference 并设置适当的 LastError 选项,则可以保证在使用同一套接字(即同一线程)的所有操作上获得先读后写语义。
如果您使用多个线程,并且不从辅助节点读取数据,那么只要在第一个线程中写入完成后在第二个线程中发出读取操作,就可以保证获得写入后读取一致性。您可以使用标准线程同步原语来确保这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)