在. NET中使用MongoDB和NoRM。令我困惑的是-没有交易记录(can不只是告诉MongoConnection.Begin/EndTransaction或类似的东西)。我想使用工作单元模式,并在出现故障时回滚更改。是否仍有一个干净的方法来丰富我的存储库与ITransaction?
MongoConnection.Begin/EndTransaction
ctzwtxfj1#
MongoDB不支持复杂的多文档事务。如果这是你绝对需要的,它可能不适合你。然而,在大多数情况下,我们发现复杂的事务并不是必需的。MongoDB中的所有操作都是单个文档上的原子操作,并且我们支持nice update modifiers,这使得许多需要事务的操作易于实现(并且快速)。
whlutmcx2#
MongoDB确实不支持开箱即用的事务,但你可以自己实现乐观事务。它们很适合工作单元。我写了一个java示例和一些关于GitHub的解释,所以你可以很容易地在C#中重复。
fkvaft9z3#
从v4.0开始,MongoDB支持多文档ACID事务。通过快照隔离,事务提供全局一致的数据视图,并强制执行全有或全无以维护数据完整性。有关更多信息,请参阅https://www.mongodb.com/transactions在4.2中,MongoDB还将支持分片事务。在这篇blog post文章中,我还概述了我们的多文档ACID事务之旅,如果你对历史和我们的推理感兴趣的话。
yks3o0rb4#
MongoDB 4.0将增加对多文档事务的支持。https://www.mongodb.com/transactions
zzzyeukh5#
一些记录。虽然MongoDB不支持transaction,但它支持单个文档的原子性:MongoDB确实支持单个文档中的原子操作。考虑到嵌套文档提供的可能性,此功能为大量用例提供了支持。另外,关于“Isolate Sequence of Operations“的手动输入可能会很有趣。例如:但是,您可以使用隔离操作符隔离影响多个文档的单个写操作。
u59ebvdq6#
您可以使用MongoDb TokuMX。http://www.tokutek.com/products/tokumx-for-mongodb/TokuMXTM是MongoDB的一个开源、高性能发行版,与基本的MongoDB相比,它大大提高了性能和运营效率。TokuMX是MongoDB的直接替代品,提供了20倍的性能提升,数据库大小减少了90%,并通过MVCC支持ACID事务。
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"); } }
字符串
oogrdqng8#
是的,根据数据库版本的不同,有多种方法可以为MongoDB应用工作单元模式。在MongoDB 4.0之前,没有对多文档ACID事务的支持。然后开发人员使用“两阶段提交协议”(单数据库)和“三阶段提交协议”(分布式数据库上的非阻塞)来创建自己的事务层,该事务层提供了数据一致性**,但没有**全或无执行来维护数据完整性。因此,这种方式降低了性能。MongoDB 4.0增加了对多文档ACID事务的支持。资料来源:https://en.wikipedia.org/wiki/Two-phase_commit_protocolhttps://en.wikipedia.org/wiki/Three-phase_commit_protocol的https://www.mongodb.com/transactions的
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。对我很有效!
9条答案
按热度按时间ctzwtxfj1#
MongoDB不支持复杂的多文档事务。如果这是你绝对需要的,它可能不适合你。
然而,在大多数情况下,我们发现复杂的事务并不是必需的。MongoDB中的所有操作都是单个文档上的原子操作,并且我们支持nice update modifiers,这使得许多需要事务的操作易于实现(并且快速)。
whlutmcx2#
MongoDB确实不支持开箱即用的事务,但你可以自己实现乐观事务。它们很适合工作单元。我写了一个java示例和一些关于GitHub的解释,所以你可以很容易地在C#中重复。
fkvaft9z3#
从v4.0开始,MongoDB支持多文档ACID事务。通过快照隔离,事务提供全局一致的数据视图,并强制执行全有或全无以维护数据完整性。有关更多信息,请参阅https://www.mongodb.com/transactions
在4.2中,MongoDB还将支持分片事务。
在这篇blog post文章中,我还概述了我们的多文档ACID事务之旅,如果你对历史和我们的推理感兴趣的话。
yks3o0rb4#
MongoDB 4.0将增加对多文档事务的支持。
https://www.mongodb.com/transactions
zzzyeukh5#
一些记录。
虽然MongoDB不支持transaction,但它支持单个文档的原子性:
MongoDB确实支持单个文档中的原子操作。考虑到嵌套文档提供的可能性,此功能为大量用例提供了支持。
另外,关于“Isolate Sequence of Operations“的手动输入可能会很有趣。例如:
但是,您可以使用隔离操作符隔离影响多个文档的单个写操作。
u59ebvdq6#
您可以使用MongoDb TokuMX。
http://www.tokutek.com/products/tokumx-for-mongodb/
TokuMXTM是MongoDB的一个开源、高性能发行版,与基本的MongoDB相比,它大大提高了性能和运营效率。TokuMX是MongoDB的直接替代品,提供了20倍的性能提升,数据库大小减少了90%,并通过MVCC支持ACID事务。
bjp0bcyl7#
FYI -现在已经改变了
字符串
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的
vlf7wbxs9#
MongoDB从4.0版开始支持transaction,从4.4版开始,它还支持在transaction中创建集合
我刚刚使用mongoDB atlas提供的免费集群在mongoDB中启用并测试了transaction,该集群使用mongoDB 5.0版本
以下设置应该适用于mongoDB 4.2+版本,尽管尚未测试。
pom.xml
字符串
MongoConfig.java
型
然后在要启用transaction的函数上添加@ transaction。
对我很有效!