【问题标题】:Transaction support in MongoDBMongoDB 中的事务支持
【发布时间】:2014-11-20 11:24:51
【问题描述】:

我是 MongoDB 的新手。我读到了MongoDB does not support multi-document transactions这里http://docs.mongodb.org/manual/faq/fundamentals/

如果我想以原子方式将数据保存在两个集合(A 和 B)中,那么我不能使用 MongoDB 来做到这一点,即如果在 B 的情况下保存失败,A 仍然会有数据。不是很大的劣势吗?

不过,人们仍在使用 MongoDB 而不是 RDBMS。为什么?

【问题讨论】:

  • 除了过于宽泛和主观之外,默认答案:因为我们想要并且它适合我们的场景?还要考虑一下:在一个非金钱/资源交易应用程序(如 90% 的应用程序)中,有多少行真正相互依赖?相反,您可以为此实现称为最终一致性的东西,从而使其按需分段。当然,这也更快、更容易扩展
  • @Sammaye 说得对。这一切都与您的用例有关。 NoSQL 更多地用于存储增长巨大的原始数据并从中获得商业价值。来到事务支持它不支持它。你可能会喜欢这个,不确定它是否已经上市使用tokutek.com/2013/04/…

标签: mongodb rdbms nosql


【解决方案1】:

MongoDB 4.0 现在增加了对多文档 ACID 事务的支持。 以供参考 See Refrence

【讨论】:

    【解决方案2】:

    更新 MongoDB 已经开始支持多文档事务。 https://docs.mongodb.com/manual/core/transactions/

    MongoDB 不支持多文档事务。

    但是,MongoDB 确实提供了对单个文档的原子操作。通常,这些文档级原子操作足以解决关系数据库中需要 ACID 事务的问题。

    例如,在 MongoDB 中,您可以将相关数据嵌入到嵌套数组或单个文档中的嵌套文档中,并在单个原子操作中更新整个文档。关系型数据库可能表示具有多个表和行的同一类型的数据,这需要事务支持来原子地更新数据。

    【讨论】:

      【解决方案3】:

      MongoDB 不支持事务,但保存一个文档是原子的。

      因此,最好以这样一种方式设计您的数据库架构,即所有需要以原子方式保存的数据都将放在一个文档中。

      【讨论】:

      • 如果您有两个需要转账的银行账户,最好将这两个账户保存在一个文档中,或者,如果您允许所有账户之间的交易,则将它们全部保存在一个文档中文件
      • @Sammaye 我可以提供一种比特币方法作为示例。所以,一个人需要将他的一些余额转移给另一个人。在这种情况下,只会创建一个文档 - transaction(它只是集合的名称,它不是 SQL 的事务)。帐户没有余额字段,余额始终根据交易列表计算。
      • 所以你会有一个交易被两个银行账户读取?这听起来很……不安全,使用交易作为余额计算已经够糟糕了
      • @Sammaye 为什么它不安全?您在服务器上处理事务。如果交易涉及某个账户,则该账户必须处理该交易。我认为它足够安全。
      • 您是根据另一个人来判断一个人的账户余额。我不希望我的银行余额被投注在我已转帐的人的余额交易上。此外,交易可能并不总是代表余额,您可以进行额外交易提款
      【解决方案4】:

      MongoDB 不支持关系数据库中的事务。事务中的 ACID 假设是 MySQL 中存储引擎提供的完全不同的功能

      InnoDB 引擎在 MySQL 中的一些特性:

      • 崩溃恢复
      • 双写缓冲区
      • 自动提交设置
      • 隔离级别

      这是 MongoDB 社区不得不说的:

      MongoDB 不支持传统的锁定或具有回滚功能的复杂事务。

      MongoDB 旨在实现轻量级、快速和可预测的性能。通过保持事务支持极其简单,MongoDB 可以提供更高的性能,尤其是对于具有多个数据库服务器进程的分区或复制系统。

      事务的目的是确保整个数据库在多个操作发生时保持一致。

      但与大多数关系数据库相反,MongoDB 并非设计为在单个主机上运行。它被设计成一个由多个分片组成的集群,其中每个分片是多个服务器的副本集(可选地位于不同的地理位置)。

      但如果您仍在寻找使交易成为可能的方法:

      • 尝试使用 mongo 提供的文档级原子性
      • Mongo中的两阶段提交为基本操作提供了简单的事务机制
      • mongomvcc 建立在 mongo 之上,也支持事务,正如他们所说的
      • MySQL 和 Mongo 的混合体

      【讨论】:

        【解决方案5】:

        使用此处描述的两阶段提交方法的多文档更新或“多文档事务”:http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/

        【讨论】:

          【解决方案6】:

          这个问题已经很老了,但对于偶然发现此页面的任何人,您都可以使用fawn。这是一个解决这个确切问题的 npm 包。披露:我写的

          假设您有两个银行账户,一个属于 John Smith,另一个属于 Broke Individual。您想将 20 美元从 John Smith 转移到 Broke Individual。假设所有名字和姓氏对都是唯一的,这可能看起来像:

          var Fawn = require("fawn");
          var task = Fawn.Task()
          
          //assuming "Accounts" is the Accounts collection 
          task.update("Accounts", {firstName: "John", lastName: "Smith"}, {$inc: {balance: -20}})
            .update("Accounts", {firstName: "Broke", lastName: "Individual"}, {$inc: {balance: 20}})
            .run()
            .then(function(){
              //update is complete 
            })
            .catch(function(err){
              // Everything has been rolled back. 
          
              //log the error which caused the failure 
              console.log(err);
            });
          

          警告: 任务目前不是孤立的(正在处理),所以从技术上讲,两个任务可以检索和编辑同一个文档,因为这就是 MongoDB 的工作方式。

          这实际上只是教程网站上两阶段提交示例的通用实现:https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/

          【讨论】:

          • 虽然您已经披露了您与链接的从属关系,使其不是垃圾邮件,但它仍然是仅链接答案,通常会被删除.最好把答案中的重点总结一下,并提供链接供参考。
          • @JohnnyHK 我已经添加了该信息
          【解决方案7】:

          从 4.0 版开始,MongoDB 将添加对多文档事务的支持。因此,您将拥有 MongoDB 中具有 ACID 保证的文档模型的强大功能。 MongoDB 中的事务将类似于关系数据库中的事务。

          详情请访问此链接:https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb?jmp=community

          【讨论】:

            【解决方案8】:

            仅支持单文档交易

            您可以在以下位置查看:https://docs.mongodb.com/v3.2/tutorial/perform-two-phase-commits/

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-11-23
              • 1970-01-01
              • 1970-01-01
              • 2021-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多