MongoUnitOfWork
public static class MongoUnitOfWork
{
public static async Task Transaction(this IMongoDatabase database, Func<Task> commands)
{
if (database == null) throw new ArgumentNullException("database");
var commited = false;
var beginTransaction = new BsonDocument("beginTransaction", "true");
await database.RunCommandAsync<BsonDocument>(beginTransaction);
while (!commited)
{
try
{
commands();
commited = true;
var commitTransaction = new BsonDocument("commitTransaction", "true");
await database.RunCommandAsync<BsonDocument>(commitTransaction);
}
catch (Exception)
{
var retryTransaction = new BsonDocument(new[] {
new BsonElement("beginTransaction", "true"),
new BsonElement("retry","true")
});
database.RunCommandAsync<BsonDocument>(retryTransaction).Wait();
}
}
}
}