我是MongoDB的新手。我了解到在这里http://docs.mongodb.org/manual/faq/fundamentals/,MongoDB不支持多文档事务
。
如果我想要原子地保存两个集合(A和B)的数据,那么我不能使用MongoDB,也就是说,如果在B的情况下保存失败,则A仍将具有数据。这不是一个很大的缺点吗?
尽管如此,为什么人们仍然使用MongoDB而不是关系型数据库管理系统?
我是MongoDB的新手。我了解到在这里http://docs.mongodb.org/manual/faq/fundamentals/,MongoDB不支持多文档事务
。
如果我想要原子地保存两个集合(A和B)的数据,那么我不能使用MongoDB,也就是说,如果在B的情况下保存失败,则A仍将具有数据。这不是一个很大的缺点吗?
尽管如此,为什么人们仍然使用MongoDB而不是关系型数据库管理系统?
更新 MongoDB已经开始支持多文档事务。 https://docs.mongodb.com/manual/core/transactions/
MongoDB不支持多文档事务。
然而,MongoDB提供了单个文档的原子操作。通常这些文档级别的原子操作足以解决需要关系型数据库中ACID事务的问题。
例如,在MongoDB中,您可以在单个文档内嵌入相关数据的嵌套数组或嵌套文档,并在单个原子操作中更新整个文档。关系型数据库可能会使用多个表和行来表示相同类型的数据,这将需要事务支持才能以原子方式更新数据。
MongoDB不支持事务,但保存一个文档是原子性的。
因此,最好设计数据库架构,使需要原子性保存的所有数据都放在一个文档中。
MongoDB不支持关系型数据库中的事务处理。MySQL中存储引擎提供了ACID原则下的事务,这与MongoDB完全不同。
以下是MySQL InnoDB引擎的一些特点:
这是MongoDB社区的说法:
MongoDB不支持传统锁定或带有回滚的复杂事务。
MongoDB旨在轻量级、快速且可预测。通过保持事务支持极其简单,MongoDB可以提供更好的性能,特别是对于具有多个数据库服务器进程的分区或副本系统。
事务的目的是确保整个数据库在进行多个操作时保持一致。
但与大多数关系型数据库不同,MongoDB并非设计用于单个主机。它被设计为由多个分片组成的集群,在每个分片中,都是多个服务器的副本集(也可以位于不同的地理位置)。
但如果您仍然希望使事务成为可能:
使用两阶段提交方法进行多文档更新或“多文档事务”,在此处描述:http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/
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);
});
从版本4.0开始,MongoDB将支持多文档事务。因此,在MongoDB中,您将拥有文档模型的ACID保证的能力。
MongoDB中的事务将类似于关系数据库中的事务。
有关详细信息,请访问此链接:https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb?jmp=community