MongoDB的写入机制为fire and forget
。但这是否可以保证我的写入最终会被写入磁盘?所以,如果我有这样的声明(在pymongo)
collection.insert(doc) #not passing safe=True
据我所知,我在上述声明中的写入不会立即到达磁盘,但可以保证它会到达磁盘(可能是第二天或一周之后),也可能会丢失并且永远不会回来。我的应用程序需要不希望写入同步完成,但他们希望写入即使在几个小时后也能发生。
答案 0 :(得分:9)
“fire and forget”(也就是MongoDB的默认写入)的含义是驱动程序不会确认与服务器的写入。您的写入被放置在网络上,驱动程序确认它已到达网络传输,但过去没有执行其他检查。
只要服务器&网络上升,预计写入会成功。但是,这也意味着您不会发现违反唯一索引等问题。
写入最初发生在内存中,并且每60秒至少刷新到磁盘。如果你打开了日志,那么写入将在100毫秒内进入日志 - 这个日志可以在mongod重启时发生崩溃时恢复。
如果要验证写入是否已成为mongod并成功应用于内存,则应设置safe = True
答案 1 :(得分:1)
AFAIK Fire and Forget无法保证 - 如果您需要它们,那么请使用安全[这就是它的用途!]
答案 2 :(得分:0)
它可能会迷路而且永远不会回来。这可能是由于停电,硬件故障或其他环境问题而发生的。如果文档违反某些唯一索引,也会发生这种情况。
safe=True
将确保插入时没有任何数据库引擎错误。这使得驱动程序在写入后立即发出getLastError
命令,如果写入违反了唯一索引或者存在一些潜在的Mongo问题,它将返回错误。如果你在内存写入和写入日志之间断电,这对你没有帮助。
getLastError
numerous other options可以通过safe
选项来确保写入使其成为日志(持久),或者在命令返回之前复制。我们通常会告诉人们至少使用日记选项来处理他们关心的内容。