Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在MongoDB之上实现多版本并发控制(MVCC)?_Mongodb_Transactions_Mvcc_Nosql - Fatal编程技术网

是否可以在MongoDB之上实现多版本并发控制(MVCC)?

是否可以在MongoDB之上实现多版本并发控制(MVCC)?,mongodb,transactions,mvcc,nosql,Mongodb,Transactions,Mvcc,Nosql,MongoDB对我来说是一个很棒的数据库。然而,在某些情况下,我确实需要原子多文档事务。例如,在账户之间转移东西(如金钱或声誉),这需要完全成功或完全失败 我想知道是否有可能通过实现多版本并发控制模式的库与MongoDB交互 表现会有多差? 使用混合方法(仅在必要时使用“mongo mvcc”库,仅在处理单个文档时使用传统的db连接)是否可能且有利可图,或者这会破坏mvcc的功能 MongoDB并不是真正为处理事务而设计的。关于如何实现这一点,有一个非常好的讨论:货币交易可以通过两阶段提交来实现

MongoDB对我来说是一个很棒的数据库。然而,在某些情况下,我确实需要原子多文档事务。例如,在账户之间转移东西(如金钱或声誉),这需要完全成功或完全失败

我想知道是否有可能通过实现多版本并发控制模式的库与MongoDB交互

表现会有多差?
使用混合方法(仅在必要时使用“mongo mvcc”库,仅在处理单个文档时使用传统的db连接)是否可能且有利可图,或者这会破坏mvcc的功能

MongoDB并不是真正为处理事务而设计的。关于如何实现这一点,有一个非常好的讨论:

货币交易可以通过两阶段提交来实现:

当你需要真正的交易时,你可以使用RDBMS来支持它们:)NoSQL更快、更具可扩展性,主要是因为它们不支持交易


如果您同时需要这两个功能,那么让事务层支持事务和NoSQL层用于其他目的可能是一个好主意?在某些情况下,使用MongoDB和PostgreSQL创建一个混合系统并不困难。最简单的方法是使用锁(两阶段提交),尽管在某些情况下这不是很有效。为了获得更高的并发性,可以在Mongo之上实现某种MVCC。本文提供了一个很好的描述:


现在GitHub上提供了MongoDB上的MVCC实现:


你试过了吗?@Jimmy Sawczuk:这只适用于单个文档谢谢链接。然而,这篇文章说:“当然,如果我们需要在同一个操作中借记一个账户,贷记另一个账户,或者如果我们想要回滚,我们需要完整的交易。”这正是我的问题……理论上,创建具有混合持久性的系统并不难,但我想在实践中,这是一个完全不同的故事……与couchdb的技术概述不同,它写道:“如果存储引擎得到增强,允许多文档更新事务,那么在使用上游服务器进行复制时,可以执行类似‘全有或全无’原子提交之类的颠覆[…]”。我想说NoSQL引擎可能会丢弃多文档事务,但这不是一个要求…MongoDB也有两个开放的票据,要求多文档事务:并且:RDBMS可能需要支持事务,但并不是每一个支持事务的DBMS都是关系型的。请考虑改进您的邮件,因为您的答案本质上是一个链接。见:和