在 .NET 中使用 MongoDB 和 NoRM。
让我感到困惑的事情 - 没有交易
(不能只是告诉MongoConnection.Begin/EndTransaction
或类似的东西)。
我想使用工作单元模式和回滚更改以防万一发生故障。
是否还有一种干净的方法可以使用 ITransaction 丰富我的存储库?
在 .NET 中使用 MongoDB 和 NoRM。
让我感到困惑的事情 - 没有交易
(不能只是告诉MongoConnection.Begin/EndTransaction
或类似的东西)。
我想使用工作单元模式和回滚更改以防万一发生故障。
是否还有一种干净的方法可以使用 ITransaction 丰富我的存储库?
MongoDB 不支持复杂的多文档事务。如果这是你绝对需要的东西,它可能不适合你。
然而,在大多数情况下,我们发现复杂的事务不是必需的。MongoDB 中的所有操作都是对单个文档的原子操作,并且我们支持不错的更新修饰符,这使得许多需要事务的操作易于实现(并且快速)。
确实,MongoDB 不支持开箱即用的事务,但您可以自己实现乐观事务。它们非常适合工作单元。我在GitHub 上写了一个 java 示例和一些解释,以便您可以轻松地在 C# 中重复。
从 v4.0 开始,MongoDB 支持多文档 ACID 事务。通过快照隔离,事务提供全局一致的数据视图,并强制执行全有或全无以保持数据完整性。有关更多信息,请参阅https://www.mongodb.com/transactions
在 4.2 中,MongoDB 还将支持分片事务。
在这篇博文中,我还概述了我们的多文档 ACID 交易之旅,以防您对历史和我们的推理感兴趣。
MongoDB 4.0 将增加对多文档事务的支持。
您可以改用 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