2010-04-16 42 views
26

在.NET中使用MongoDB和NoRM。MongoDB交易?

让我困惑的事 - 没有交易
(不能只是告诉MongoConnection.Begin/EndTransaction或类似的东西)。

我想在工作失败的情况下使用Unit of work模式和回滚更改。

如何通过ITransaction来丰富我的存储库还有一个简洁的方法吗?

回答

28

MongoDB不支持复杂的多文档事务。如果这是你绝对需要的东西,那可能不适合你。

但是,在大多数情况下,我们发现复杂的交易不是必需的。 MongoDB中的所有操作在单个文档中都是原子的,我们支持很好的update modifiers,这使得很多操作需要易于实现(和快速)的事务。

+0

我没有得到'update modifiers'部分。他们到底能够帮到什么? (请记住,我是这个完整的新手:) :) – 2010-04-17 06:22:17

+1

更新修饰符允许您使用单个操作自动执行某些复杂的操作 - 认为像“通过x增加此字段的值”或“添加一个新值这个数组“。 – mdirolf 2010-04-19 13:20:14

+0

@mdirolf如果他进入他依赖TRANSACTIONS的场景,应该重构吗? – Tushar 2014-10-05 15:08:10

17

确实,MongoDB不支持开箱即用的交易,但您可以自行实施乐观交易。他们很适合工作单位。我写了一个java例子和一些关于GitHub的解释,所以你可以在C#中轻松地重复。

+2

这是一个很好的例子。真可惜它不是在MongoDB内部以这种方式实现的,即使是可切换的抽象/插件。 – gertas 2012-10-12 07:26:59

+1

太棒了,谢谢你这么做。 +10,如果我可以。 – jcollum 2013-01-31 01:57:36

+0

如果您需要mongodb中的交易,您应该重新考虑您的软件设计/体系结构 – dit 2016-03-11 22:33:19

1

备案记录。

虽然MongoDB中没有事务支持,它支持atomicity on a single document

MongoDB的确实有一个单一的文件中的原子操作的支持。鉴于嵌套文档提供的可能性,此功能为大量的用例提供支持。

另外,关于“Isolate Sequence of Operations”的手动输入可能很有趣。例如:

但是,您可以隔离使用隔离操作符影响多个文档的单个写入操作。

0

您可以改用MongoDb TokuMX。

http://www.tokutek.com/products/tokumx-for-mongodb/

TokuMXTM是一个开放源码,MongoDB的高性能分布,相比于基本的MongoDB已显着提高的性能和操作效率。 TokuMX是MongoDB的直接替代产品,性能提升了20倍,数据库大小减少了90%,并支持使用MVCC的ACID事务。

1

从v4.0开始(2018年夏季即将到来),MongoDB将支持多文档ACID事务。通过快照隔离,事务将提供全球一致的数据视图,并执行全有或全无执行来维护数据完整性。有关更多信息和测试版,请参阅https://www.mongodb.com/transactions

在此blog post中,我还概述了我们的多文档ACID事务的过程,以防您对历史和推理感兴趣。

1

MongoDB 4。0将增加对多文档交易的支持。

https://www.mongodb.com/transactions

+0

而不仅仅是提供链接,请将关键文本放入您的答案中。否则,如果链路断开,我们将失去答案! :) – sniperd 2018-02-23 19:13:02