MongoDB中的事务支持
我是MongoDB的新手。我在这里了解到,MongoDB中的事务支持,mongodb,rdbms,nosql,Mongodb,Rdbms,Nosql,我是MongoDB的新手。我在这里了解到,MongoDB不支持多文档事务 如果我想以原子方式将数据保存在两个集合(A和B)中,那么我不能使用MongoDB来实现这一点,也就是说,如果在B的情况下保存失败,A仍将拥有数据。这不是一个很大的缺点吗 尽管如此,人们仍在使用MongoDB而不是RDBMS。为什么?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为什么它是不安全的?您可以在服务器上操作事务。如果交易涉及某个帐户,则该帐户必须处理该交易。我认为它足够安全。你是在根据一个人的账户余额判断另一个人的账户余额。我不希望我的银行余额被押注在我转帐给的人的余额交易上。此外,交易可能并不总是代表余额,您可以有额外的交易记录