2010年的.NET中的MongoDB事务?

29
玩弄MongoDB和.NET中的NoRM。
让我困惑的是 - 没有事务(不能只是告诉MongoConnection.Begin/EndTransaction之类的)。
我想使用工作单元模式,在某些情况下回滚更改。
是否仍有一种干净的方式来使用ITransaction来丰富我的存储库?

已接受的答案已过时,因为MongoDB现在支持事务。您可以查看以下链接,在其中我分享了启用mongoDB事务所需的代码:https://dev59.com/IXE85IYBdhLWcg3wr1ux#72466573 - Siddharth Shakya
9个回答

30

MongoDB不支持复杂的多文档事务。如果您确实需要这个功能,那么它可能不太适合您。

然而,在大多数情况下,我们发现复杂的事务并不是必需的。在MongoDB中,所有操作都针对单个文档进行原子操作,并且我们支持很好的更新修改器,这使得许多需要事务的操作变得易于实现(而且快速)。


我不太明白“update modifiers”这部分。它们到底有什么用处呢?(请记住,我对此完全是新手) :) - Arnis Lapsa
1
更新修饰符允许您使用单个操作原子地执行某些复杂操作,例如“将此字段的值增加x”或“向此数组添加新值”。 - mdirolf
如果一个人陷入了依赖TRANSACTIONS的情况,他应该进行重构吗? @mdirolf - tusharmath
8
这个答案已经过时了。MongoDB现在支持多文档ACID事务。请参考https://www.mongodb.com/blog/post/mongodb-multi-document-acid-transactions-general-availability。 - Grigori Melnik

20

虽然MongoDB原生不支持事务,但是你可以自己实现乐观锁事务。它们适用于工作单元。我在GitHub上编写了一个Java示例和一些说明,以便您可以轻松地在C#中重复。


2
这是一个非常好的例子。可惜MongoDB内部没有以可切换的抽象/插件方式实现它。 - gertas
如果您需要在MongoDB中使用事务,那么您应该重新考虑您的软件设计/架构。 - dieter
1
不再是真的了。MongoDB 4.0支持多文档ACID事务。 - Grigori Melnik

7
从v4.0开始,MongoDB支持多文档ACID事务。通过快照隔离,事务提供全局一致的数据视图,并执行全有或全无的操作以维护数据完整性。更多信息请参见https://www.mongodb.com/transactions
在4.2中,MongoDB还将支持分片事务。
在这篇博客文章中,我还概述了我们实现多文档ACID事务的历程和思考过程,如果您对此感兴趣。

MongoDB 4.0 RC0已经发布 - 在https://www.mongodb.com/download-center#development的开发版本中查看。 - Grigori Melnik
1
事务已经到来!4.0 GA版本已经发布。https://www.mongodb.com/blog/post/mongodb-multi-document-acid-transactions-general-availability - Grigori Melnik

2

1
请提供关键文本,而不仅仅是链接。否则,如果链接失效,我们将失去答案! :) - sniperd

0

请注意 - 这已经改变了

using (var session = mongoDbContext.MongoDatabase.Client.StartSession())
            {
                var itemAuthRepo = (Repository<ItemAuthorization, ObjectId>)mongoDbContext.ItemAuthorizations;
                var calendarRepo = (Repository<CalendarEvent, ObjectId>)mongoDbContext.Calendars;

                if (itemAuthRepo != null && calendarRepo!=null)
                {
                    session.StartTransaction();

                    try
                    {
                        itemAuthRepo.Collection.InsertOne(session, newItemAuthorization);
                        calendarRepo.Collection.InsertOne(session, cal);
                        session.CommitTransaction();
                    }
                    catch (Exception ex)
                    {
                        session.AbortTransaction();
                        throw;
                    }
                }
                else
                {
                    throw new Exception("IRepository was not casted to Repository");
                }
            }

0

MongoDB从4.0版本开始支持事务,从4.4版本开始还支持在事务中创建集合。

我刚刚在由MongoDB Atlas提供的免费集群中启用并测试了MongoDB中的事务,该集群使用的是MongoDB 5.0版本。

以下设置应适用于MongoDB 4.2+版本,尽管尚未经过测试。

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.0</version>
</parent>

<properties>
    <java.version>11</java.version>
    <mongodb.version>4.4.0</mongodb.version>
</properties>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.7.0</version>
</dependency>

MongoConfig.java

@Configuration
public class MongoConfig
{
    @Bean
    MongoTransactionManager transactionManager(MongoDatabaseFactory 
    mongoDatabaseFactory)
    {
        return new MongoTransactionManager(mongoDatabaseFactory);
    }
}

然后在您想要启用事务的函数上添加 @Transactional。

这对我有效!


0

你可以使用 TokuMX 替代 MongoDb。

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

TokuMXTM是MongoDB的一个开源高性能分支,相比基本的MongoDB,它显著提高了性能和操作效率。TokuMX可以直接替换MongoDB,并提供20倍的性能提升、90%的数据库大小减少以及支持带有MVCC的ACID事务。

0

一些记录的笔记。

虽然 MongoDB 没有事务支持,但它支持单个文档上的原子性:

MongoDB 在单个文档内具有原子操作的支持。由于嵌套文档提供的可能性,此功能为大量用例提供了支持。

此外,关于“隔离操作序列”的手册条目可能很有趣。例如:

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


0

是的,根据数据库版本,有多种方法可以应用于MongoDB的工作单元模式。

在MongoDB 4.0之前,没有支持多文档ACID事务。然后开发人员使用“两阶段提交协议”(单个数据库)和“三阶段提交协议”(非阻塞分布式数据库)创建自己的事务层,提供了数据一致性,但不是全部或无执行以维护数据完整性。因此,这种方式降低了性能。

MongoDB 4.0已经添加了对多文档ACID事务的支持。

来源:

https://en.wikipedia.org/wiki/Two-phase_commit_protocol

https://en.wikipedia.org/wiki/Three-phase_commit_protocol

https://www.mongodb.com/transactions


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接