Partilhar via


Transações distribuídas

Uma transação é um conjunto de tarefas relacionadas que são bem-sucedidas (commit) ou falham (abortam) como uma unidade, entre outras coisas. Uma transação distribuída é uma transação que afeta vários recursos. Para que uma transação distribuída seja confirmada, todos os participantes devem garantir que qualquer alteração nos dados será permanente. As alterações devem persistir apesar de falhas do sistema ou outros imprevistos. Se até mesmo um único participante não fizer essa garantia, toda a transação falhará e quaisquer alterações nos dados dentro do escopo da transação serão revertidas.

Nota

Uma exceção será lançada se você tentar confirmar ou reverter uma transação se uma DataReader for iniciada enquanto a transação estiver ativa.

Trabalhando com System.Transactions

No .NET Framework, as transações distribuídas são gerenciadas por meio da API no System.Transactions namespace. A System.Transactions API delegará o tratamento de transações distribuídas a um monitor de transações, como o Microsoft Distributed Transaction Coordinator (MS DTC), quando vários gerenciadores de recursos persistentes estiverem envolvidos. Para obter mais informações, consulte Fundamentos da transação.

ADO.NET 2.0 introduziu o suporte para o alistamento em uma transação distribuída usando o EnlistTransaction método, que alista uma conexão em uma Transaction instância. Em versões anteriores do ADO.NET, o alistamento explícito em transações distribuídas era realizado usando o EnlistDistributedTransaction método de uma conexão para inscrever uma conexão em uma ITransaction instância, que é suportada para compatibilidade com versões anteriores. Para obter mais informações sobre transações de Serviços Corporativos, consulte Interoperabilidade com Serviços Corporativos e Transações COM+.

Ao usar uma System.Transactions transação com o Provedor do .NET Framework para SQL Server em um banco de dados do SQL Server, um leve Transaction será usado automaticamente. A transação pode então ser promovida para uma transação totalmente distribuída conforme necessário. Para obter mais informações, consulte Integração System.Transactions com o SQL Server.

Nota

O número máximo de transações distribuídas das quais um banco de dados Oracle pode participar ao mesmo tempo é definido como 10 por padrão. Após a 10ª transação quando conectado a um banco de dados Oracle, uma exceção é lançada. A Oracle não oferece suporte DDL dentro de uma transação distribuída.

Alistamento automático em uma transação distribuída

O alistamento automático é a maneira padrão (e preferida) de integrar ADO.NET conexões com System.Transactionso . Um objeto de conexão se alistará automaticamente em uma transação distribuída existente se determinar que uma transação está ativa, o que, em System.Transaction termos, significa que Transaction.Current não é nula. O alistamento automático de transações ocorre quando a conexão é aberta. Isso não acontecerá depois disso, mesmo que um comando seja executado dentro de um escopo de transação. Você pode desabilitar o alistamento automático em transações existentes especificando Enlist=false como um parâmetro de cadeia de conexão para um SqlConnection.ConnectionString, ou OLE DB Services=-7 como um parâmetro de cadeia de conexão para um OleDbConnection.ConnectionStringarquivo . Para obter mais informações sobre parâmetros de cadeia de conexão Oracle e ODBC, consulte OracleConnection.ConnectionString e OdbcConnection.ConnectionString.

Alistamento manual em uma transação distribuída

Se o alistamento automático estiver desabilitado ou se você precisar inscrever uma transação que foi iniciada depois que a conexão foi aberta, você poderá se inscrever em uma transação distribuída existente usando o EnlistTransaction método do DbConnection objeto para o provedor com o qual está trabalhando. O alistamento em uma transação distribuída existente garante que, se a transação for confirmada ou revertida, as modificações feitas pelo código na fonte de dados também serão confirmadas ou revertidas.

O alistamento em transações distribuídas é particularmente aplicável ao agrupar objetos de negócios. Se um objeto de negócios estiver agrupado com uma conexão aberta, o alistamento automático de transações só ocorrerá quando essa conexão for aberta. Se várias transações forem realizadas usando o objeto de negócios agrupado, a conexão aberta para esse objeto não se alistará automaticamente em transações recém-iniciadas. Nesse caso, você pode desabilitar o alistamento automático de transações para a conexão e inscrever a conexão em transações usando EnlistTransactiono .

EnlistTransaction usa um único argumento do tipo Transaction que é uma referência à transação existente. Depois de chamar o método da conexão, todas as modificações feitas na fonte de EnlistTransaction dados usando a conexão são incluídas na transação. Passar um valor nulo cancela a conexão de seu alistamento de transação distribuída atual. Observe que a conexão deve ser aberta antes de chamar EnlistTransaction.

Nota

Uma vez que uma conexão é explicitamente alistada em uma transação, ela não pode ser deslistada ou alistada em outra transação até que a primeira transação seja concluída.

Atenção

EnlistTransaction lança uma exceção se a conexão já tiver iniciado uma transação usando o método da BeginTransaction conexão. No entanto, se a transação for uma transação local iniciada na fonte de dados (por exemplo, executando a instrução BEGIN TRANSACTION explicitamente usando um SqlCommand), EnlistTransaction reverterá a transação local e se inscreverá na transação distribuída existente, conforme solicitado. Você não receberá um aviso de que a transação local foi revertida e deve gerenciar todas as transações locais que não foram iniciadas usando BeginTransactiono . Se você estiver usando o Provedor de Dados do .NET Framework para SQL Server (SqlClient) com o SQL Server, uma tentativa de se alistar gerará uma exceção. Todos os outros casos passarão despercebidos.

Transações promocionais no SQL Server

O SQL Server dá suporte a transações promocionais nas quais uma transação leve local pode ser promovida automaticamente para uma transação distribuída somente se for necessária. Uma transação promocional não invoca a sobrecarga adicional de uma transação distribuída, a menos que a sobrecarga adicional seja necessária. Para obter mais informações e um exemplo de código, consulte System.Transactions Integration with SQL Server.

Configurando transações distribuídas

Poderá ter de ativar o MS DTC através da rede para utilizar transações distribuídas. Se tiver o Firewall do Windows habilitado, você deve permitir que o serviço MS DTC use a rede ou abra a porta MS DTC.

Consulte também