MongoDB文档和博客描述了它的交易功能。
MongoDB写入操作在文档级别符合ACID标准 - 包括>自动更新嵌入式阵列和子文档的能力。
现在我想知道这是"文档级交易支持"足够 ? 足够我的意思是它可以像老式RDBMS中的事务支持一样好吗?
关于可能的重复,我想到的是一个普遍的问题,"这就足够了?"对于开发人员?或不。
答案 0 :(得分:3)
我会同意约书亚并加上我的两分钱。在RDBMS世界中,事务经常更新多个规范化数据承载结构。需要强大的原子性级别来确保将更改作为一个单元提交给所有这些结构,或作为一个单元回滚。在MongoDB中,理想情况下,您应该设计模式,以便将逻辑上属于一起的数据保存在同一文档中。这使得文档级原子性完全适合您的典型文档模式。
我也同意RDBMS和MongoDB事务处理都不应该是防止错误和数据损坏的唯一防线。对于必须是原子的关键数据更改,您应始终在更新后的代码级别检查一致性。
最后一个想法:在大多数RDBMS系统中,事务处理并不总是一对一地映射到并发。通常,大型事务可以锁定整个表或表,并导致响应中的积压。在MongoDB中,事务处理中的文档级ACID合规性与使用WiredTiger存储引擎的人可用的文档级并发性很好地配对。如果考虑到这一点,您的应用程序可以在文档级别高度并发且完全符合ACID,从而为事务性工作负载提供高水平的性能和吞吐量。
干杯,
比尔芬奇答案 1 :(得分:0)
回答这个问题需要了解NoSQL世界中的模式设计。如果你像在RDBMS中那样接近你的架构设计,那么你将会遇到非常糟糕的时间,而不仅仅是因为交易。
但是,如果您正确设计文档,文档级别的ACID合规性应该适用于99%的用例。我甚至认为,除了99%以外,在1%的用例中,你不应该依赖你的数据库进行交易。这将是一个非常复杂的情况,你要并行更改两个完全独立的东西。即使在RDBMS中,如果您这样做,也总是在代码中编写验证。
一个例子可能是银行客户的批量更新,他们让他们同时更改姓名和更改地址。在RDBMS中,这些可能是单独的表。在MongoDB中,这些都将在同一文档中。所以这适合99%。
借记到一个帐户并向另一个帐户贷记将是适合1%的示例。您可以将它包装在SQL中的事务中,但如果您之后不编写代码来验证写入,那么您将失去工作。你永远不会依赖数据库。与MongoDB相同,它们是两个不同的文档。
答案 2 :(得分:0)
文档级事务很好,但对于实际应用程序来说还不够。一般来说,你必须像在RDBMS世界中那样思考一下,使用“子文档”,你可以在没有集合范围的事务的情况下解决很多情况,但是有足够的用例,你肯定需要收集 - 广泛的交易。 帐户系统的借方/贷方情况就是一个例子......或者如果你实施了一个战斗游戏,其中两个玩家互相争斗而一个(赢家)从另一个获得“资源”(更宽松)。 ..你必须并行更新两个玩家的资源状态,或者两者都必须回滚,如果出现故障。 MongoDB事务处理不像在RDBM系统中那样处理。
再一次,正如其他人已经说过的那样:你必须在对象/文档结构中思考,在那里你可以处理很多情况,文档级事务就足够了......
但是收集范围内的交易是MongoDB的路线图; - )
答案 3 :(得分:0)
如果能够将所有逻辑数据包含在一个文档中,MongoDB将比关系数据库更快,性能更高。您必须确保所有数据将同时写入(在文档级别符合ACID)。
如果您不赶时间,MongoDB正努力在各个集合中进行交易!
此致 涓
答案 4 :(得分:0)
从4.0版开始,MongoDB将添加对多文档事务的支持。因此,您将拥有MongoDB中具有ACID保证的文档模型的强大功能。
有关详细信息,请访问此链接:https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb?jmp=community