2

假设您有一个 ACID 数据库。如果没有关于操作顺序的明确保证,您仍然可以根据持久性推断顺序。

例如

  1. 我插入x数据库,语句返回
  2. 现在我插入y
  3. 由于耐用性保证,我知道x以前是耐用y的。

因此,如果发生崩溃,我要么有:

  1. 没有xy在数据库中
  2. 只要x
  3. xy。_

现在假设一个具有宽松持久性保证的数据库。例如,没有安全模式或 getlasterror 的 MongoDB。

我有什么保证在第二个操作变得持久之前第一个操作是持久的?
请指出我声称这一点的文档部分或适当的测试。
如果发生故障,我的数据库是否可以包含y但不包含x

编辑:
似乎默认(唯一?)存储机制是内存映射文件引擎。如果没有启用日志(现在默认启用),服务器崩溃似乎会导致不一致且无法修复的状态。我想答案就在日记里。

4

2 回答 2

2

回答我自己的问题:

日记有保证。具体来说,日志是write-ahead重做日志。

启用日记功能后,将在您选择的数据库路径下的 journal/ 子目录中创建日记文件。这些文件是预写重做日志。此外,将创建最后一个序列号文件journal/lsn。干净关闭会删除 journal/ 下的所有文件。

资料来源:http ://www.mongodb.org/display/DOCS/Journaling#Journaling-JournalFiles

没有日记就无法保证(我可以找到或理解)。MongoDB 使用内存映射文件作为它的主要存储引擎。对内存的写入不会立即反映在文件系统中。在操作系统崩溃的情况下(例如),文件可能处于不一致且不可恢复的状态。

于 2011-11-07T20:24:14.970 回答
1

根据您的用例,您可以使用 Mongo 的Capped Collections来维护集合中对象的插入顺序。不过有一些限制,请查看文档。

您还可以从排序和自然排序中获得更多见解:

对于标准表,自然顺序并不是特别有用,因为虽然顺序通常接近插入顺序,但不能保证是. 但是,对于 Capped Collections,自然顺序保证为插入顺序。

于 2011-11-07T20:05:47.543 回答