题
玩弄MongoDB和规范。网。
事把我弄糊涂-没有交易记录
(不能就这么告诉 MongoConnection.Begin/EndTransaction
或者类似的东西).
我想要使用工作单元模式和rollback变化的情况下,一些失败。
还有一个干净的方式如何丰富我的储存库将ITransaction?
解决方案
MongoDB的不支持复杂的多文件交易。如果这是你绝对需要它可能不是一个非常适合你。
在大多数情况下,然而,我们发现复杂的交易,不是必需的。 MongoDB中的所有操作都在一个单一的文件原子,我们支持不错更新修饰,该使很多操作,将需要一个交易容易实现(和快速)。
其他提示
这是真实的简化版,MongoDB的交易支持开箱即用,但你可以实现你自己的乐观事务。他们适合精细的工作单元。我写了一个Java示例和一些解释 GitHub的这样你就可以在C#中轻松地重复。
作为V4.0的,MongoDB的支持多文档ACID事务。通过快照隔离,交易提供数据的全球一致的看法,并实施全有或全无的执行,以保持数据的完整性。对于更多的信息,请参见 https://www.mongodb.com/transactions
在4.2,将MongoDB的也支持分片数据。
在此博客帖子,我也概述了我们的旅程多文档ACID事务中,如果你有兴趣在历史和我们的推理情况。
4.0的MongoDB将增加对多文件事务的支持。
一些笔记记录。
同时MongoDB不会有事务的支持,它支持 原子性在一个单一的文件:
MongoDB并支持原子操作的内的一个单一的文件。鉴于提供的可能性嵌套文件,这一功能提供支持,对于大量的使用情况。
此外,该手册条约"隔离操作的顺序"可能是有趣的。E.g.:
然而,可以分离出一个写作的影响的多个文件使用的隔离操作员。
可以使用代替的MongoDB TokuMX。
http://www.tokutek.com/products/tokumx-for-mongodb /
TokuMXTM是一个开放源码,MongoDB的高性能分布相比基本MongoDB的具有显着改进的性能和操作效率。 TokuMX是一个简易替代MongoDB的,并提供20X的性能改进,在数据库大小减少90%,并支持与MVCC ACID事务。
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");
}
}
是的,有申请的MongoDB取决于数据库版本工作模式的单位多种方式。
直到MongoDB的4.0,存在对于多文档ACID事务的支持。然后开发者已经使用的“两阶段提交协议”(单个数据库)和“三阶段提交”(非阻塞上分布式数据库)来创建已设置的数据一致性其自己的事务层的但不强>全有或全无的执行,以保持数据的完整性。因此,这种方式已经撤下性能。
4.0的MongoDB已增加了对多文档ACID事务的支持。
来源:
https://en.wikipedia.org/wiki/Two-phase_commit_protocol