MongoDB中的事务支持

时间:2014-11-20 11:24:51

标签: mongodb rdbms nosql

我是MongoDB的新手。我在MongoDB does not support multi-document transactions http://docs.mongodb.org/manual/faq/fundamentals/看了{{1}}。

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

但是,人们正在使用MongoDB而不是RDBMS。为什么呢?

8 个答案:

答案 0 :(得分:9)

MongoDB不支持多文档交易。

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

MongoDB不支持Relational DB中的事务。事务中的ACID假设是MySQL中存储引擎提供的完全不同的功能

MySQL中 InnoDB引擎的一些功能:

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

这就是MongoDB社区所说的:

MongoDB不支持使用回滚的传统锁定或复杂事务。

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

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

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

这个问题相当陈旧,但对于偶然发现此页面的任何人,您都可以使用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/

答案 6 :(得分:0)

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

有关详细信息,请访问此链接:https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb?jmp=community

答案 7 :(得分:-1)

仅支持单一文件交易

您可以在https://docs.mongodb.com/v3.2/tutorial/perform-two-phase-commits/

看到它