2010年.NET中的MongoDB交易?

sxissh06  于 2023-11-17  发布在  Go
关注(0)|答案(9)|浏览(99)

在. NET中使用MongoDB和NoRM。
令我困惑的是-没有交易记录
(can不只是告诉MongoConnection.Begin/EndTransaction或类似的东西)。
我想使用工作单元模式,并在出现故障时回滚更改。
是否仍有一个干净的方法来丰富我的存储库与ITransaction?

ctzwtxfj

ctzwtxfj1#

MongoDB不支持复杂的多文档事务。如果这是你绝对需要的,它可能不适合你。
然而,在大多数情况下,我们发现复杂的事务并不是必需的。MongoDB中的所有操作都是单个文档上的原子操作,并且我们支持nice update modifiers,这使得许多需要事务的操作易于实现(并且快速)。

whlutmcx

whlutmcx2#

MongoDB确实不支持开箱即用的事务,但你可以自己实现乐观事务。它们很适合工作单元。我写了一个java示例和一些关于GitHub的解释,所以你可以很容易地在C#中重复。

fkvaft9z

fkvaft9z3#

从v4.0开始,MongoDB支持多文档ACID事务。通过快照隔离,事务提供全局一致的数据视图,并强制执行全有或全无以维护数据完整性。有关更多信息,请参阅https://www.mongodb.com/transactions
在4.2中,MongoDB还将支持分片事务。
在这篇blog post文章中,我还概述了我们的多文档ACID事务之旅,如果你对历史和我们的推理感兴趣的话。

yks3o0rb

yks3o0rb4#

MongoDB 4.0将增加对多文档事务的支持。
https://www.mongodb.com/transactions

zzzyeukh

zzzyeukh5#

一些记录。
虽然MongoDB不支持transaction,但它支持单个文档的原子性:
MongoDB确实支持单个文档中的原子操作。考虑到嵌套文档提供的可能性,此功能为大量用例提供了支持。
另外,关于“Isolate Sequence of Operations“的手动输入可能会很有趣。例如:
但是,您可以使用隔离操作符隔离影响多个文档的单个写操作。

u59ebvdq

u59ebvdq6#

您可以使用MongoDb TokuMX。
http://www.tokutek.com/products/tokumx-for-mongodb/
TokuMXTM是MongoDB的一个开源、高性能发行版,与基本的MongoDB相比,它大大提高了性能和运营效率。TokuMX是MongoDB的直接替代品,提供了20倍的性能提升,数据库大小减少了90%,并通过MVCC支持ACID事务。

bjp0bcyl

bjp0bcyl7#

FYI -现在已经改变了

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");
                }
            }

字符串

oogrdqng

oogrdqng8#

是的,根据数据库版本的不同,有多种方法可以为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

vlf7wbxs

vlf7wbxs9#

MongoDB从4.0版开始支持transaction,从4.4版开始,它还支持在transaction中创建集合
我刚刚使用mongoDB atlas提供的免费集群在mongoDB中启用并测试了transaction,该集群使用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);
    }
}


然后在要启用transaction的函数上添加@ transaction。
对我很有效!

相关问题