我只是简单地回答这个问题。
正如其他人所说的那样,MongoDB 并不完全符合 ACID,实际上有时与大多数 NoSQL DB 一样会破坏 ACID 合规性,无论从他们嘴里冒出多少营销,NoSQL 的本质确实会破坏 ACID。
写入内存的任何事务都不符合 ACID,因为内存是临时存储,因此您不能保证它已写入磁盘并在您的网络中复制,这会立即破坏 ACID 以进行持久写入。我不确定 Gigaspaces 是如何做到这一点的,但这听起来像是我个人不会看的东西。
为了成为 ACID,您必须先写入磁盘(也许也写入网络中的两个节点?)然后数据库必须写回临时存储,而不是相反。
现在 Mongo 确实提供了写入磁盘甚至多个节点的安全性。在 PHP 中,它提供了safe
and选项,您可以使用该选项来指示在函数 ( , , ) 返回 true 或 falsefsync
之前它应该写入多少个节点。所以你可以在你的应用程序中得到写关注。您还可以将您的实际副本和分片设置为完全一致,本质上它们不是,但您可以。不仅如此,MongoDB 还有日记功能。实际上,即使写入内存写入也“不持久”100 毫秒(严重的是,您将在 100 毫秒内丢失多少数据?我敢打赌,您的应用程序的持久性不如实际情况)。insert
save
update
当进行事务和两阶段提交时,困难的部分就来了。大多数人通过使用要插入的文档的哈希值和/或版本号来找到克服这些问题的方法。我刚刚在 Google 上快速搜索了一个我知道支持 ACID 事务和两阶段提交的 Java 框架,但我在找到它时遇到了问题。如果您在用户组中搜索一些用户组,并且用户组中有完整的解释(我知道这一点,因为我参与了一些)关于如何根据哈希和版本号在 MongoDB 中实现回滚。然而,我应该警告你,就像在 SQL 中一样,事务非常缓慢,并且有点违背 MongoDB 的基本原理。
所以现在你知道了如何开始依赖 Mongo,甚至在你的应用程序中拥有一个缓慢的事务处理程序,以应对那些需要对许多相互依赖的文档进行持久写入的小时候。
那么,如果我的 Web 应用程序在用户的访问读写操作方面增长,是否有一个面向酸性事务支持的 dbms 文档可以很好地扩展?
这取决于您对扩展的关注程度,我认为这里没有人可以对此给出认真的答案。
至于其他 DB 的 Fbs 使用情况。有一次,我在写完一个小时后在墙上丢失了大约 5 个墙贴。我就此事联系了 Fb,并要求他们提供一个令人讨厌的解释。他们说,即使墙上的帖子写入临时存储,它也无法同步到永久存储。所以所有这些谈话 Fb 完全符合 ACID 只是谈话,正如 Kristian 所说,他们使用包括 NoSQL 在内的许多数据库。
希望这会有帮助,