由于蒙戈不具有可用于确保没有被提交到数据库的交易,除非其一贯的(非腐败)的数据,如果我的申请作出写入一个文件,并作出相关写入到另一个文档之间的模具,我可以用什么方法去除损坏的数据和/或以某种方式恢复?
Answer 1:
NoSQL的背后更大的想法是用一个精心建模的数据结构的特定问题,而不是打用锤子每一个问题。 这也是交易,应为“短命交易”被称为真实的,因为典型的RDBMS交易几乎与“真实”的,长期的交易有所帮助。
那种通过的RDBMS支持的交易,通常需要仅仅是因为有限的数据模型迫使你将数据存储在多个表,而不是使用嵌入式阵列(认为的典型发票/发票项目的例子)。
在MongoDB中,尝试一个单一的文件,它提高了读取速度,数据局部性和确保一致性使用写沉重,反规范化的数据结构 ,并保持数据。 这样的数据模型也更容易规模化,因为一个只读命中,而不必收集来自多个来源的数据在一台服务器。
不过,也有地方的数据必须在各种情况下的读取和反规范化变得不可行的情况下。 在这种情况下,你可能想看看两阶段提交或选择完全不同的并发方法,如MVCC (在一个句子,这就是SVN,GIT中,等喜欢做的)。 后者,然而,很难说是简易替换为RDBMS,但公开一种完全不同的并发的应用程序的一个更高的水平,如果不是用户。
Answer 2:
想到这里我自己,我想找出一些类别的影响:
- 你的手术只有一个数据库保存(将数据保存到一个文件)
- 你的操作有两个数据库保存(更新,插入和删除),A和B
- 他们是独立的
- B被需要用于为有效
- 它们是相互依存的(需要一种用于乙是有效的,且A是有效的乙是必需的)
- 你的操作有两个以上的数据库保存
我认为这是一般的可能性的完整列表。 在案例1中,你有没有问题 - 一个数据库保存为原子。 在2.1的情况下,同样的事情,如果他们是独立的,它们很可能会成为两个独立的操作。
对于2.2的情况下,如果你做第一个那么B,在最坏的情况,你将有一些额外的数据(B数据),这将占用空间在您的系统,但在其他方面是无害的。 在2.3的情况下,你可能会在发生灾难性故障的情况下,一些损坏的数据。 和案例3仅仅是一个2秒的情况下组成。
针对不同情况的一些例子:
1.0。 你换汽车文档的颜色为“蓝色”
2.1。 你改变汽车文档的颜色,以“红”,司机的头发颜色为“红色”
2.2。 您创建一个新的引擎文件和其ID添加到车文档
2.3.a. 你改变你的车的“gasType”到“柴油机”,这需要改变你的引擎为“柴油”型发动机。
2.3.b. 2.3另一个例子:你搭上车的文档A到另一辆车文档B,A收到“towedBy”属性设置为B的ID,和B得到“牵引”属性设置为A的ID
3.0。 我会离开的这个例子你的想象力
在许多情况下,它可以把一个2.3情景为2.2的情况。 在2.3.A例如,汽车的文件和发动机是分开的文件。 让我们忽略将发动机汽车文档中的这个例子的可能性。 它都无效有柴油发动机和非柴油气体, 并具有非柴油发动机和柴油气体。 因此,他们都必须改变。 但它可能是有效的有没有发动机在所有,并有柴油气体。 所以,你可以增加一个步骤,使整个事情在所有点有效。 首先,去除发动机,然后更换了气,然后更改发动机的类型,最后加上发动机放回车上。
如果您将从2.3情景让损坏的数据,你需要一种方法来检测损坏。 在示例2.3.B,事情可能会破坏如果一个文档中的“牵引”属性,但其他文件不具有相应的“towedBy”属性。 所以这可能是一个灾难性的失败后检查。 发现有“拖”,但在该属性的ID不具有其“towedBy”设置为正确的ID文件的所有文件。 这些选项将有删除的“牵引”属性或设置相应的“towedBy”属性。 他们似乎都同样有效,但它可能取决于你的应用程序。
在某些情况下,你也许能找到这样损坏的数据,但你不会知道数据是什么设定的那些东西了。 在这种情况下,设置默认可能是聊胜于无。 某些类型的腐败比其他人(特别是在应用程序中导致错误,而不是简单的不正确显示数据的那种)更好。
如果上面的那种代码分析或损坏修复变得不可行,或者如果你想避免任何数据损坏可言,你最后的手段是采取mnemosyn的建议和实施两阶段提交 , MVCC ,或类似的东西,可以让你识别并回滚处于不确定状态的变化。