【发布时间】:2011-02-08 23:03:08
【问题描述】:
在 .NET 中使用 MongoDB 和 NoRM。
让我感到困惑的事情 - 没有交易
(不能只告诉MongoConnection.Begin/EndTransaction 或类似的东西)。
我想使用工作单元模式并回滚更改以防万一发生故障。
是否还有一种干净的方法可以使用 ITransaction 丰富我的存储库?
【问题讨论】:
标签: .net transactions mongodb norm
在 .NET 中使用 MongoDB 和 NoRM。
让我感到困惑的事情 - 没有交易
(不能只告诉MongoConnection.Begin/EndTransaction 或类似的东西)。
我想使用工作单元模式并回滚更改以防万一发生故障。
是否还有一种干净的方法可以使用 ITransaction 丰富我的存储库?
【问题讨论】:
标签: .net transactions mongodb norm
MongoDB 不支持复杂的多文档事务。如果这是你绝对需要的东西,它可能不适合你。
但是,在大多数情况下,我们发现复杂的事务不是必需的。 MongoDB 中的所有操作都是对单个文档的原子操作,我们支持 nice update modifiers,这使得许多需要事务的操作易于实现(且速度快)。
【讨论】:
update modifiers 部分。他们究竟能提供什么帮助? (请记住,我在这方面完全是新手):)
确实,MongoDB 不支持开箱即用的事务,但您可以自己实现乐观事务。它们非常适合工作单元。我在GitHub 上写了一个 java 示例和一些解释,以便您可以轻松地在 C# 中重复。
【讨论】:
从 v4.0 开始,MongoDB 支持多文档 ACID 事务。通过快照隔离,事务提供全局一致的数据视图,并强制执行全有或全无以保持数据完整性。欲了解更多信息,请参阅https://www.mongodb.com/transactions
在 4.2 中,MongoDB 还将支持分片事务。
在此blog post 中,我还概述了我们的多文档 ACID 交易之旅,以防您对历史和我们的推理感兴趣。
【讨论】:
MongoDB 4.0 将增加对多文档事务的支持。
【讨论】:
一些笔记记录。
虽然MongoDB没有事务支持,但支持atomicity on a single document:
MongoDB 确实支持单个文档中的原子操作。鉴于嵌套文档提供的可能性,此功能为大量用例提供支持。
另外,关于“Isolate Sequence of Operations”的手动输入可能很有趣。例如:
但是,您可以使用隔离运算符隔离影响多个文档的单个写入操作。
【讨论】:
您可以改用 MongoDb TokuMX。
http://www.tokutek.com/products/tokumx-for-mongodb/
TokuMXTM 是一个开源的高性能 MongoDB 发行版,与基本的 MongoDB 相比,它显着提高了性能和运营效率。 TokuMX 是 MongoDB 的直接替代品,性能提升 20 倍,数据库大小减少 90%,并支持 MVCC 的 ACID 事务。
【讨论】:
仅供参考 - 现在已经改变了
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");
}
}
【讨论】:
是的,根据数据库版本,有多种方法可以为 MongoDB 应用工作单元模式。
在 MongoDB 4.0 之前,不支持多文档 ACID 事务。然后开发人员使用“两阶段提交协议”(单数据库)和“三阶段提交协议”(分布式数据库上的非阻塞)创建自己的事务层,提供数据一致性但不 全有或全无执行以保持数据完整性。所以这种方式降低了性能。
MongoDB 4.0 增加了对多文档 ACID 事务的支持。
来源:
https://en.wikipedia.org/wiki/Two-phase_commit_protocol
【讨论】: