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:SQL Server
O namespace System.Transactions fornece uma estrutura de transação totalmente integrada com a integração ADO.NET e CLR (Common Language Runtime) do SQL Server. A classe System.Transactions.TransactionScope torna um bloco de código transacional ao inscrever implicitamente conexões em uma transação distribuída. Você deve chamar o método Complete no final do bloco de código marcado pelo TransactionScope. O método Dispose é invocado quando a execução do programa deixa um bloco de código, fazendo com que a transação seja descontinuada se o método Complete não for chamado. Se for lançada uma exceção que faça com que o código saia do escopo, a transação será considerada descontinuada.
Recomendamos que você empregue um bloco using para garantir que o método Dispose seja chamado no objeto TransactionScope quando o bloco using for encerrado. A falha em confirmar ou reverter transações pendentes pode prejudicar seriamente o desempenho porque o tempo limite padrão para o TransactionScope é de um minuto. Se você não usar uma instrução using, deverá executar todo o trabalho em um bloco Try e chamar explicitamente o método Dispose no bloco Finally.
Se ocorrer uma exceção dentro do TransactionScope, a transação é marcada como inconsistente e é abandonada. Ele reverte quando o TransactionScope é descartado. Se nenhuma exceção ocorrer, as transações participantes serão confirmadas.
TransactionScope deve ser usado apenas quando fontes de dados locais e remotas ou gerenciadores de recursos externos estão sendo acessados, porque TransactionScope sempre faz com que as transações sejam promovidas, mesmo que esteja sendo usado apenas dentro de uma conexão de contexto.
A classe TransactionScope cria uma transação com um System.Transactions.Transaction.IsolationLevel de Serializable por padrão. Dependendo do seu aplicativo, convém considerar a redução do nível de isolamento para evitar alta contenção em seu aplicativo.
Observação
Recomendamos que você execute apenas atualizações, inserções e exclusões em transações distribuídas em servidores remotos porque elas consomem recursos significativos do banco de dados. Se a operação for executada no servidor local, uma transação distribuída não é necessária e uma transação local será suficiente.
SELECT instruções podem bloquear recursos de banco de dados desnecessariamente e, em alguns cenários, pode ser necessário usar transações para seleções. Qualquer trabalho que não seja de banco de dados deve ser feito fora do escopo da transação, a menos que envolva outros gerentes de recursos transacionados.
Embora uma exceção dentro do escopo da transação impeça que a transação seja confirmada, a classe TransactionScope não tem nenhuma provisão para reverter quaisquer alterações que seu código faça fora do escopo da transação em si. Se você precisar tomar alguma ação quando a transação for revertida, deverá escrever sua própria implementação da interface System.Transactions.IEnlistmentNotification e se alistar explicitamente na transação.
Exemplos
Para trabalhar com System.Transactions, você deve ter uma referência ao arquivo System.Transactions.dll.
O código a seguir demonstra como criar uma transação que pode ser promovida em duas instâncias diferentes do SQL Server. Essas instâncias são representadas por dois objetos System.Data.SqlClient.SqlConnection diferentes, que são encapsulados em um bloco TransactionScope. O código cria o bloco TransactionScope com uma instrução using e abre a primeira conexão, que o alista automaticamente no TransactionScope. A transação é inicialmente listada como uma transação leve, não uma transação totalmente distribuída. O código pressupõe a existência de lógica condicional (omitida por brevidade). Ele abre a segunda conexão somente se for necessário, inscrevendo-a no TransactionScope.
Quando a conexão é aberta, a transação é automaticamente promovida para uma transação distribuída completa. Em seguida, o código invoca TransactionScope.Complete, que confirma a transação. O código descarta as duas conexões ao sair das instruções using para as conexões. O método TransactionScope.Dispose para o TransactionScope é chamado automaticamente no encerramento do bloco de using para o TransactionScope. Se uma exceção foi lançada em qualquer ponto do bloco TransactionScope, Complete não é chamada e a transação distribuída é revertida quando o TransactionScope é descartado.
using (TransactionScope transScope = new TransactionScope())
{
using (SqlConnection connection1 = new
SqlConnection(connectString1))
{
// Opening connection1 automatically enlists it in the
// TransactionScope as a lightweight transaction.
connection1.Open();
// Do work in the first connection.
// Assumes conditional logic in place where the second
// connection will only be opened as needed.
using (SqlConnection connection2 = new
SqlConnection(connectString2))
{
// Open the second connection, which enlists the
// second connection and promotes the transaction to
// a full distributed transaction.
connection2.Open();
// Do work in the second connection.
}
}
// The Complete method commits the transaction.
transScope.Complete();
}