我是MongoDB的新手。我在MongoDB does not support multi-document transactions
http://docs.mongodb.org/manual/faq/fundamentals/看了{{1}}。
如果我想原子地将数据保存在两个集合(A和B)中,那么我不能使用MongoDB这样做,即如果在B的情况下保存失败,仍然A将拥有数据。这不是一个很大的劣势吗?
但是,人们正在使用MongoDB而不是RDBMS。为什么呢?
答案 0 :(得分:9)
MongoDB不支持多文档交易。
然而, MongoDB确实在单个文档上提供原子操作。通常,这些文档级原子操作足以解决在关系数据库中需要ACID事务的问题。
例如,在MongoDB中,您可以将嵌套数组或嵌套文档中的相关数据嵌入到单个文档中,并在单个原子操作中更新整个文档。关系数据库可能代表具有多个表和行的相同类型的数据,这需要事务支持以原子方式更新数据。
答案 1 :(得分:4)
MongoDB不支持事务,但保存一个文档是原子的。
因此,最好以这样的方式设计数据库模式,即需要以原子方式保存的所有数据都将放在一个文档中。
答案 2 :(得分:3)
MongoDB不支持Relational DB中的事务。事务中的ACID假设是MySQL中存储引擎提供的完全不同的功能
MySQL中 InnoDB引擎的一些功能:
这就是MongoDB社区所说的:
MongoDB不支持使用回滚的传统锁定或复杂事务。
MongoDB旨在实现轻量级,快速且可预测的性能。通过保持事务支持非常简单,MongoDB可以提供更高的性能,尤其是对于具有多个数据库服务器进程的分区或复制系统。
事务的目的是确保在执行多个操作时整个数据库保持一致。
但与大多数关系数据库相反,MongoDB并非设计为在单个主机上运行。它被设计为多个分片的集群,其中每个分片是多个服务器的副本集(可选地在不同的地理位置)。
但如果您仍在寻找使交易成为可能的方法:
答案 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/
看到它