none
Transação distribuída entre mysql e sql server, como fazer? RRS feed

  • Pergunta

  • Boa Tarde Pessoal,

    Estou necessitando fazer uma inserção de dados ao mesmo tempo num banco mysql e outro sql server 2000. Estou usando o transactionscope para realizar o controle da transação, mas sempre dá erro informando que o mysql não dá suporte para tal procedimento. Será se alguém poderia me ajudar?

    Uso a versão  5 do mysql server e o mysql connector 6.0.2.

    Segue abaixo o método que estou provendo

     //Realiza a atualização implícita em ambos SGBDs
            private static bool InserirDados(string DescricaoLogradouro)
            {
                //Caso não ocorra nenhum problema, retornará true
                bool atualizouDados = true;
                try
                {
                    //Update único aos SGBDs MySql e SqlServer
                    string cmdText = "insert tbTiposLogradouro(sTipoLogradouroID,sDescricao) values( '" +
                     Guid.NewGuid().ToString() + "', '" + DescricaoLogradouro + "')";
                    //TransactionScope: mantém a atomicidade das transações efetuadas internamente ao using
                    using (TransactionScope trans = new TransactionScope())
                    {
                        using (SqlConnection sqlConn = new SqlConnection(connSqlServer))
                        {
                            //Neste momento trata-se de uma transação local
                            sqlConn.Open();
                            SqlCommand cmdSqlServer = new SqlCommand(cmdText, sqlConn);
                            cmdSqlServer.ExecuteNonQuery();
                            //Aninhando a conexão ao MySql dentro do SqlServer permite a otimização de recursos
                            using (MySqlConnection mySqlConn = new MySqlConnection(connMysql))
                            {
                                //Neste momento a transação é promovida ao MSDTC
                                mySqlConn.Open();
                                MySqlCommand cmd2000 = new MySqlCommand(cmdText, mySqlConn);
                                cmd2000.ExecuteNonQuery();
                            }
                        }
                        //Testa se deve disparar uma exceção "forçada”, para testes
                        if (false)
                            throw new Exception(".NET Magazine: Transações com .NET 2.0");
                        //Finaliza o TransactionScope, realizando o commit em ambos SGBDs
                        trans.Complete();
                    }
                }
                //Ocorrendo algum erro, retorna false, exibindo a mensagem de erro
                catch (Exception ex)
                {
                    atualizouDados = false;
                    Console.Write("Ocorreu um erro: " + ex.Message, ".NET Magazine - Transactions");
                }
                return atualizouDados;
            }

    Henrylle Maia - Desenvolvedor .NET
    sexta-feira, 22 de maio de 2009 16:54

Todas as Respostas

  • Oi,

    O transactionscope() aciona um mecanismo de transação distribuida que é controlado pelo serviço Distributed Transaction coordinator, do sistema operacional. Para que tudo funcione é necessário que o banco de dados implemente o protocolo two phase commit, podendo trabalhar em conjunto com o DTC. Oracle, por exemplo, funciona.

    Verifique se o mysql tem esse suporte e que tipo de configurações teria que realizar para que funcione. Do contrário, sem solução.

    Já vi técnicas para criação de compensators de transação para o DTC para atuarem como transaction managers para recursos não transacionais (entraria ai o mysql), mas faz tempo que não vejo algo tão complexo sendo utilizado.

    []'s

    Dennes
    *Treinamento de ASP.NET 3.5 c/Visual Studio 2008 em SP : Apenas 12xR$ 70,88 - http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    sábado, 23 de maio de 2009 01:55