Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a: .NET Framework
.NET
.NET Standard
Uma transação é um conjunto de tarefas relacionadas que ou têm sucesso (confirmam) ou falham (abortam) como 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 realizada, 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 eventos imprevistos. Se mesmo um único participante não cumprir esta garantia, toda a transação falha e quaisquer alterações aos dados dentro do âmbito da transação são revertidas.
Observação
Para informações sobre transações distribuídas no Azure SQL Database e Azure SQL Managed Instance, consulte Transações distribuídas em bases de dados cloud.
Trabalhar com System.Transactions
Em .NET, as transações distribuídas são geridas pela API no espaço de nomes System.Transactions. A System.Transactions API delegará o tratamento distribuído de transações a um monitor de transações, como o Microsoft Distributed Transaction Coordinator (MS DTC), quando estiverem envolvidos múltiplos gestores de recursos persistentes. Para mais informações, consulte Fundamentos da Transação.
ADO.NET 2.0 introduziu suporte para o alistamento numa transação distribuída usando o método EnlistTransaction, que alista uma ligação numa instância Transaction. Em versões anteriores de ADO.NET, o alistamento explícito em transações distribuídas era realizado usando o EnlistDistributedTransaction método de uma ligação para inscrever uma ligação numa ITransaction instância, o que é suportado para compatibilidade retroativa. Para mais informações sobre transações de Serviços Empresariais, consulte Interoperabilidade com Serviços Empresariais e Transações COM+.
Ao usar uma System.Transactions transação com o Microsoft SqlClient Data Provider for SQL Server contra uma base de dados SQL Server, será automaticamente utilizado um modelo leve Transaction . A transação pode então ser promovida para uma transação totalmente distribuída conforme necessário. Para mais informações, consulte Integração do System.Transactions com SQL Server.
Inscrição automática numa transação distribuída
O alistamento automático é a forma padrão (e preferida) de integrar conexões do ADO.NET com System.Transactions. Um objeto de ligação será automaticamente registado numa 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 registo automático de transações ocorre quando a ligação é aberta. Não acontecerá depois disso, mesmo que um comando seja executado dentro do âmbito de uma transação. Pode desativar o alistamento automático em transações existentes especificando Enlist=false como um parâmetro de string de conexão para um SqlConnection.ConnectionString.
Inscrição manual numa transação distribuída
Se o auto-enlistment estiver desativado ou precisar de registar uma transação iniciada após a ligação ter sido aberta, pode inscrever-se numa transação distribuída existente usando o EnlistTransaction método do SqlConnection objeto para o Microsoft SqlClient Data Provider for SQL Server. A inscrição numa 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 serão também comprometidas ou revertidas.
Observação
Se a DataReader for iniciada enquanto a transação está ativa, será lançada uma exceção se tentar confirmar ou reverter a transação.
O recrutamento em transações distribuídas é particularmente aplicável ao agrupar objetos de negócio. Se um objeto de negócio for agrupado com uma ligação aberta, o registo automático de transações só ocorre quando essa ligação é aberta. Se múltiplas transações forem realizadas usando o objeto de negócio agrupado, a ligação aberta desse objeto não será automaticamente registada nas transações recém-iniciadas. Neste caso, pode desativar o registo automático de transações para a ligação e inscrevê-la nas transações usando EnlistTransaction.
EnlistTransaction Toma um único argumento do tipo Transaction que é uma referência à transação existente. Após chamar o método EnlistTransaction da conexão, todas as modificações feitas na fonte de dados usando a conexão são incluídas na transação. Ao passar um valor nulo, a ligação é removida do seu atual alistamento na transação distribuída. Note que a ligação deve ser aberta antes de chamar EnlistTransaction.
Observação
Uma vez que uma ligação é explicitamente registada numa transação, não pode ser retirada ou registada noutra transação até que a primeira transação termine.
Atenção
EnlistTransaction lança uma exceção se a ligação já tiver iniciado uma transação usando o método da ligação BeginTransaction. No entanto, se a transação for uma transação local iniciada na fonte de dados (por exemplo, executando explicitamente a instrução BEGIN TRANSACTION usando um SqlCommand), EnlistTransaction reverterá a transação local e inscrever-se-á na transação distribuída existente conforme solicitado. Não receberá notificação de que a transação local foi revertida, e terá de gerir quaisquer transações locais que não tenham começado a usar BeginTransaction. Se estiver a usar o Microsoft SqlClient Data Provider para SQL Server com SQL Server, uma tentativa de inscrição irá lançar uma exceção. Todos os outros casos passarão despercebidos.
Transações promocionáveis no SQL Server
O SQL Server suporta transações promocionáveis em que uma transação local leve pode ser automaticamente promovida a transação distribuída apenas se for necessário. Uma transação promocionável não invoca a sobrecarga adicional de uma transação distribuída, a menos que essa sobrecarga adicional seja necessária. Para mais informações e um exemplo de código, consulte Integração do System.Transactions com SQL Server.
Configuração de Transações Distribuídas
Pode ser necessário ativar o MS DTC na rede para usar transações distribuídas. Se o firewall local do servidor do Windows estiver ativado, deve permitir que o serviço MS DTC use a rede ou abrir a porta MS DTC.