none
Transação Distribuida (Entre SQL Server 2000 e MS Access) RRS feed

  • Pergunta

  • Caros colegas;

    Seria possivel realizar uma transação distribuida entre bancos de dados SQL Server e MS Access usando os respectivos providers SqlClient e OleDbClient ?

    Eu sei que o objeto Connection possui um metodo EnlistTransaction, porém ele só aceita como argumento um objeto do tipo System.Transactions.Transaction.

    Vale ressaltar que seria interessante fazer com que o SQL Server usasse o SqlClient provider e o MS Access usasse o OleDbProvider

    Imports System.Data.OleDb

    Imports System.Data.SqlClient

    Imports System.Data.Common

     

     

    Dim sqlConnection As DbConnection = New SqlConnection

    Dim accConnection As DbConnection = New OleDbConnection

    Dim sqlTrn As DbTransaction = sqlConnection.BeginTransaction

    accConnection.EnlistTransaction(sqlTrn) <== aqui dá erro por causa do tipo de objeto que é um DbTransaction e deveria ser um System.Transactions.Transaction.

    quinta-feira, 8 de março de 2007 19:12

Respostas

  • 1-O System.Transactions (seja o TransactionScope ou whatever) funciona com SQL 2000, e vai usar DTC automaticamente

    2-Idem, vai usar o DTC

     

    Acho que você está confundindo as bolas, a única diferença no caso do SQL 2005 é a promoção automática para transações distribuídas (pelo LTM que você citou), que no caso do sql 2000, oracle e etc não acontece porque irá usar o DTC de cara.

     

    O DTC implementa um padrão chamado XA que é suportado pela maioria desses SGBD's, você com certeza não precisa usar COM+ para isso.

     

    Até porque, mesmo antes de existir o TransactionScope já tinha como fazer isso sem o COM+.

    sexta-feira, 9 de março de 2007 21:04

Todas as Respostas

  • Não.

     

    Você precisaria do DTC e até onde eu sei, o Access não suporta isso.

     

    Você precisará abrir duas transações, uma para cada conexão, e fazer commit em cada uma em separado, correndo os riscos disso.

    sexta-feira, 9 de março de 2007 00:03
  • Mateus;

    Então para que serve um objeto do tipo System.Transactions.Transaction?

    Você teria algum exemplo de código de como fazer uma transação distribuida usando o DTC?

     

    sexta-feira, 9 de março de 2007 13:35
  • Serve para isso mesmo, só que o Access não vai conseguir participar de uma transação distribuida.

     

    Código de exemplo:

    using System;

    using System.Data.SqlClient;

    using System.Transactions;

     

    namespace DataViewer.Repro {

     

        public class Repro {

     

            public static int Main(string[] args) {

                using(TransactionScope transactionscope1 = new TransactionScope()) {

                            using (SqlConnection sqlconnection1 = new SqlConnection(ConnectionString)) {

                                        sqlconnection1.Open(); //this autoenlists in the transaction scope.

                                        //do your work here.

                            }

                            // Set the scope to commit by setting the following property:

                            transactionscope1.Consistent = true;

                }// when the TransactionScope is disposed it will check the Consistent property. If this is true the DTC will commit, if it is false it will roll back.

                return 1;

            }

        }

    }

    sexta-feira, 9 de março de 2007 19:55
  • Ok Mateus,

    ... só que pelo que eu entendi, dos meus estudos, este modelo, usando o objeto do tipo TransactionScope  serve apenas para o SQL SERVER 2005 pois é gerenciado pelo LTM (Lightweight Transaction Manager), que é um gerenciador de transações distribuidas,  que vem em paralelo ao DTC pelo namespace System.Transaction

    Que eu tenha entendido, essa é uma  maneira simplificada de se fazer uma transação distribuida.

    (por favor, me corrija se eu estiver errado, e me desculpe se eu estiver um tanto confuso)

    Deixo então essas duas perguntas:

    - Para transações distribuidas, por exemplo, usando varios servidores do tipo SQL SERVER 2000, somente consigo usando o COM+?

    - E se forem servidores de bancos de dados diferentes, tipo, SQL Server 2000 e Oracle?

    sexta-feira, 9 de março de 2007 20:26
  • 1-O System.Transactions (seja o TransactionScope ou whatever) funciona com SQL 2000, e vai usar DTC automaticamente

    2-Idem, vai usar o DTC

     

    Acho que você está confundindo as bolas, a única diferença no caso do SQL 2005 é a promoção automática para transações distribuídas (pelo LTM que você citou), que no caso do sql 2000, oracle e etc não acontece porque irá usar o DTC de cara.

     

    O DTC implementa um padrão chamado XA que é suportado pela maioria desses SGBD's, você com certeza não precisa usar COM+ para isso.

     

    Até porque, mesmo antes de existir o TransactionScope já tinha como fazer isso sem o COM+.

    sexta-feira, 9 de março de 2007 21:04
  • Agradeço sua atenção Mateus.

    Pessoas como vocês, MVP's fazem com que cada dia mais, esse forum funcione com eficiência !

    sexta-feira, 9 de março de 2007 21:20