Usuário com melhor resposta
Transação Distribuida (Entre SQL Server 2000 e MS Access)

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.OleDbImports
System.Data.SqlClientImports
System.Data.CommonDim 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.
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+.
Todas as Respostas
-
-
-
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;
}
}
}
-
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?
-
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+.
-