MongoDB中的事务支持

MongoDB中的事务支持,mongodb,rdbms,nosql,Mongodb,Rdbms,Nosql,我是MongoDB的新手。我在这里了解到,MongoDB不支持多文档事务 如果我想以原子方式将数据保存在两个集合(A和B)中,那么我不能使用MongoDB来实现这一点,也就是说,如果在B的情况下保存失败,A仍将拥有数据。这不是一个很大的缺点吗 尽管如此,人们仍在使用MongoDB而不是RDBMS。为什么?MongoDB不支持事务,但保存一个文档是原子的 因此,最好以这样一种方式设计数据库模式,即需要以原子方式保存的所有数据都将放在一个文档中。MongoDB不支持多文档事务 然而,MongoDB确

我是MongoDB的新手。我在这里了解到,
MongoDB不支持多文档事务

如果我想以原子方式将数据保存在两个集合(A和B)中,那么我不能使用MongoDB来实现这一点,也就是说,如果在B的情况下保存失败,A仍将拥有数据。这不是一个很大的缺点吗


尽管如此,人们仍在使用MongoDB而不是RDBMS。为什么?

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


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

MongoDB不支持多文档事务

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


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

多文档更新或“多文档事务”使用此处描述的两阶段提交方法:

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

MySQL中InnoDB引擎的一些功能:

  • 事故恢复
  • 双写缓冲区
  • 自动提交设置
  • 隔离水平
这就是MongoDB社区要说的:

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

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

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

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

但如果您仍在寻找实现交易的方法:

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

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

      假设你有两个银行账户,一个属于约翰·史密斯,另一个属于破产个人。你想把约翰·史密斯的20美元转帐给破产的个人。假设所有名字和姓氏对都是唯一的,这可能看起来像:

      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就是这样工作的


      它实际上只是教程站点上两阶段提交示例的一般实现:

      仅支持单文档事务


      您可以在以下位置看到它:

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


      有关详细信息,请访问此链接:

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

      除了过于宽泛和主观之外,默认答案是:因为我们想这样做,而且它符合我们的场景?再想想:在一个非金钱/资源交易应用程序(比如90%的应用程序)中,有多少行真正相互依赖?相反,您可以为此实现一些称为“最终一致性”的东西,从而使其成为按需的一部分。当然,也就是说,要比以前更快、更容易扩展well@Sammaye说得对。这都是关于您的用例的。NoSQL更多地用于存储增长巨大的原始数据,并从中获取业务价值。谈到事务支持,它不支持它。您可能会喜欢这个,不确定它是否已上市使用如果您有两个需要转账的银行帐户,将这两个帐户保存在一个文档中不是一个好做法,或者,如果您允许在所有帐户之间进行交易,则将所有帐户保存在一个文档中document@Sammaye我可以举一个比特币方法为例。所以,一个人需要把他的一些余额转移给另一个人。在这种情况下,只会创建一个文档-一个
      事务
      (它只是集合的名称,而不是SQL方面的事务)。帐户的余额没有字段,余额总是根据交易列表进行计算。那么您会有一个由两个银行帐户读取的交易吗?这听起来非常…不安全,使用事务作为余额计数是不好的enough@Sammaye为什么它是不安全的?您可以在服务器上操作事务。如果交易涉及某个帐户,则该帐户必须处理该交易。我认为它足够安全。你是在根据一个人的账户余额判断另一个人的账户余额。我不希望我的银行余额被押注在我转帐给的人的余额交易上。此外,交易可能并不总是代表余额,您可以有额外的交易记录