Transações com MongoDB utilizando .Net

0
Antes do MongoDB versão 4.0, o MongoDB era transacionalmente consistente no nível do documento. Essas operações atômicas de documento único fornecem a semântica de transação para atender às necessidades de integridade de dados da maioria dos aplicativos. Isso ocorre porque a flexibilidade do modelo de documento permite que os desenvolvedores incorporem facilmente dados relacionados a uma entidade como matrizes e sub-documentos em um único documento rico. Dito isso, há alguns casos em que a divisão do conteúdo em duas ou mais coleções seria apropriada e, nesses casos, as transações ACID com vários documentos tornam mais fácil do que nunca para os desenvolvedores abordar o espectro completo de casos de uso com o MongoDB. Para uma discussão mais aprofundada sobre o design do modelo de documento do MongoDB, incluindo como representar as relações um-para-muitos e muitos-para-muitos, consulte https://docs.mongodb.com/manual/core/data-model-design/.

Aplicações C# conectados a um banco de dados MongoDB utilizam o driver do MongoDB .NET. Para adicionar o driver .NET ao seu aplicativo Visual Studio, no NuGet Package Manager, procure por “MongoDB”. Certifique-se de escolher a versão mais recente (> = 2.7) do driver e pressione Instalar.

Install-Package MongoDB.Driver -Version 2.7.0

 

No código a seguir, criaremos um objeto Product e executaremos uma transação do MongoDB que inserirá alguns dados de amostra no MongoDB e, em seguida, atualizará os preços de todos os produtos em 10%.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Bson.Serialization.Attributes;

namespace MongoDBTransaction
{
    class Program
    {
        public class Product
        {
            [BsonId]
            public ObjectId Id { get; set; }
            [BsonElement("SKU")]
            public int SKU { get; set; }
            [BsonElement("Description")]
            public string Description { get; set; }
            [BsonElement("Price")]
            public Double Price { get; set; }
        }

    const string MongoDBConnectionString = "<<YOUR MONGODB CONNECTION STRING>>";

    static async Task Main(string[] args)
    {
       if (!await UpdateProducts()) { Environment.Exit(0); }
        Console.WriteLine("Finished updating the product collection");
        Console.ReadKey();
    }
    static async Task<bool> UpdateProducts()
    {
        //Create client connection to our MongoDB database
        var client = new MongoClient(MongoDBConnectionString);

        //Create a session object that is used when leveraging transactions
        var session = client.StartSession();

        //Create the collection object that represents the "products" collection
        var products = session.Client.GetDatabase("MongoDBStore").GetCollection<Product>("products");

        //Clean up the collection if there is data in there
        products.Database.DropCollection("products");

        //Create some sample data
    var TV = new Product { Description = "Television", SKU = 4001, Price = 2000 };
    var Book = new Product { Description = "A funny book", SKU = 43221, Price = 19.99 };
    var DogBowl = new Product { Description = "Bowl for Fido", SKU = 123, Price = 40.00 };

        //Begin transaction
        session.StartTransaction();

        try
        {
            //Insert the sample data 
            await products.InsertOneAsync(TV);
            await products.InsertOneAsync(Book);
            await products.InsertOneAsync(DogBowl);

            var filter = new FilterDefinitionBuilder<Product>().Empty;
            var results = await products.Find<Product>(filter).ToListAsync();
            Console.WriteLine("Original Prices:\n");
            foreach (Product d in results)
            {
                Console.WriteLine(String.Format("Product Name: {0}\tPrice: {1:0.00}", d.Description, d.Price));
            }

            //Increase all the prices by 10% for all products
            var update = new UpdateDefinitionBuilder<Product>().Mul<Double>(r=>r.Price,1.1);
            await products.UpdateManyAsync(filter, update); //,options);

            //Made it here without error? Let's commit the transaction
            session.CommitTransaction();

            //Let's print the new results to the console
            Console.WriteLine("\n\nNew Prices (10% increase):\n");
            results = await products.Find<Product>(filter).ToListAsync();
            foreach (Product d in results)
            {
                Console.WriteLine(String.Format("Product Name: {0}\tPrice: {1:0.00}", d.Description, d.Price));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Error writing to MongoDB: " + e.Message);
            session.AbortTransaction();
      return false;
        }
        return true;
    }
  }

 

Código Fonte disponível no Github.

Pontos chave:

  • Você não precisa corresponder propriedades de classe a objetos JSON – basta definir um objeto de classe e inseri-lo diretamente no banco de dados. Não há necessidade de uma camada ORM (Object Relational Mapper).
  • As transações do MongoDB usam o isolamento de instantâneo, o que significa que apenas o cliente envolvido na sessão transacional vê as alterações até o momento em que a transação é confirmada.
  • O MongoDB .NET Driver facilita o aproveitamento de transações e a otimização da sintaxe baseada em LINQ para consultas.

 

Um grande abraço a todos!

Fonte: https://www.mongodb.com/blog/

Compartilhe.

Sobre o autor

Criador do blog Código Simples e com mais 9 anos de experiência em TI, com títulos de MVP Microsoft na área de Visual Studio Development, Neo4j Top 50 Certificate, Scrum Master e MongoDB Evangelist. Atuando em funções analista, desenvolvedor, arquiteto, líder técnico e gestor de equipes. Mais informações em : http://jhonathansoares.com