none
Problema com Transaction EntityFramework 6 RRS feed

  • Pergunta

  • Bom dia

    Criei um windows service para rodar em um servidor, quando instalo o serviço no meu pc funciona perfeitamente, porém no servidor da um erro de transaction.

    Segue o erro: A conexão já faz parte de um local ou de uma transação distribuída
                         The connection is already part of a local or a distributed transaction

    Queria saber se fiz algo de errado para dar esse erro ou se é necessário configurar alguma coisa no servidor.

    Segue mais ou menos como está estruturado o código.

                using (TransactionScope transaction = new TransactionScope())
                {
                    try
                    {
                        using (MyDbContextEntity db = new MyDbContextEntity())
                        {
                            tabela1 oTabela1 = new tabela1();
                            otabela1.ID = 1;
                            oTabela1.Name = "teste";
    
                            db.tabela1.Add(oTabela1);
                            db.SaveChanges();
    
                            tabela2 oTabela2 = new tabela2();
                            otabela2.ID = 1;
                            oTabela2.Price = 500;
    
                            db.tabela2.Add(oTabela2);
                            db.SaveChanges();
    
                            tabela3 oTabela3 = new tabela3();
                            otabela3.ID = 1;
                            oTabela3.email = "teste@teste.com";
    
                            db.tabela3.Add(oTabela3);
                            db.SaveChanges();
                        }
                        transaction.Complete();
                    }
                    catch (Exception ex)
                    {
                        transaction.Dispose();
                    }
                    finally
                    {
                        transaction.Dispose();
                    }
                }

    EDIT - O banco de dados que estou usando é oracle.

    Obrigado.


    • Editado Deivid Carvalho quinta-feira, 25 de maio de 2017 12:01 Informação
    quinta-feira, 25 de maio de 2017 11:46

Respostas

  • Bom dia Deivid Carvalho,

    Vejo que você não utilizou todos os tramitês do transaction, use o exemplo abaixo para mitigar o problema:

    public void DoSomething()
    {
       using (var db = GetContext())
       {
            using (var ts = GetTransactionScope())
            {
                //do stuff
                db.SaveChanges();
                ts.Complete();
            }
       }
    }
    
    public TransactionScope GetTransactionScope()
    {
        var tso = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
        return new TransactionScope(TransactionScopeOption.Required, tso);
    }


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 31 de maio de 2017 13:42

Todas as Respostas

  • Bom dia Deivid Carvalho,

    Vejo que você não utilizou todos os tramitês do transaction, use o exemplo abaixo para mitigar o problema:

    public void DoSomething()
    {
       using (var db = GetContext())
       {
            using (var ts = GetTransactionScope())
            {
                //do stuff
                db.SaveChanges();
                ts.Complete();
            }
       }
    }
    
    public TransactionScope GetTransactionScope()
    {
        var tso = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
        return new TransactionScope(TransactionScopeOption.Required, tso);
    }


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 31 de maio de 2017 13:42
  • Deivid, você pode adicionar os itens e chamar o SaveChanges() no final da operação, o comportamento será o mesmo usar uma transaction, o ORM Entity Framework foi pensado para trabalhar dessa forma, portanto, os dados serão salvos em um "lote".
    quarta-feira, 31 de maio de 2017 14:04