Exportar (0) Imprimir
Expandir Tudo
Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
Tradução
Original
1 de 1 pessoas classificaram isso como útil - Avalie este tópico

Classe TransactionScope

Faz um bloco de código transacional. Esta classe não pode ser herdada.

Namespace:  System.Transactions
Assembly:  System.Transactions (em System.Transactions.dll)
public sealed class TransactionScope : IDisposable

The System.Transactions infra-estrutura oferece tanto um modelo de programação explícito baseado na Transaction classe, bem sistema autônomo um usando o modelo de programação implícito a TransactionScope classe, na qual sistema autônomo transações são automaticamente gerenciadas pela infra-estrutura.

Observação importanteObservação importante:

É recomendável que você crie transações implícitas usando o TransactionScope a classe, para que o contexto de transação de ambiente é gerenciado automaticamente para você. Você também deve usar o TransactionScope e DependentTransaction classe de aplicativos que exigem o uso da mesma transação em várias chamadas de função ou várias chamadas do thread. Para obter mais informações sobre esse modelo, consulte o Implementar uma transação Implicit usando escopo de transações  tópico. Para obter mais informações sobre como escrever um aplicativo transacional, consulte Writing a Aplicativo Transactional.

Após instanciar um TransactionScope com o new demonstrativo, o gerenciador de transação determina qual transação participar. Uma vez determinado, o escopo participa sempre essa transação.A decisão é baseada em dois fatores: se houver uma transação de ambiente e o valor do parâmetro no construtor de TransactionScopeOption.A transação ambiente é a seu código é executado de transação.Você pode obter uma referência para a transação ambiente chamando o estático Current propriedade das Transaction classe. Para obter mais informações sobre como esse parâmetro é usado, consulte a seção "Gerenciamento de fluxo de transações" dasImplementar uma transação Implicit usando escopo de transações  tópico.

Se nenhuma exceção ocorrer dentro do escopo de transação (isto é, entre a inicialização do TransactionScope objeto e a chamada de sua Dispose método), e, em seguida, a transação que participa o escopo tem permissão para continuar. Se ocorrer uma exceção dentro do escopo de transação, a transação que participa será revertida.

Quando seu aplicativo conclui todo o trabalho que deseja executar em uma transação, você deve telefonar o Complete método apenas uma vez para informar esse gerenciador de transação que é aceitável para confirmar a transação. Falha ao telefonar esse método anula a transação.

Uma telefonar para o Dispose método marca o participante do escopo da transação. Exceções que ocorrem depois de chamar este método não podem afetar a transação.

Se você modificar o valor de Current dentro de um escopo, uma exceção é lançada quando Dispose é chamado. No entanto, no participante do escopo, o valor anterior é restaurado.Além disso, se você telefonar Dispose em Current dentro de um escopo de transação que criou a transação, a transação for anulada no participante do escopo.

O exemplo a seguir demonstra como usar o TransactionScope classe para definir um bloco de código para participar de uma transação.

'  This function takes arguments for 2 connection strings and commands to create a transaction '  involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the '  transaction is rolled back. To test this code, you can connect to two different databases '  on the same server by altering the connection string, or to another 3rd party RDBMS  '  by altering the code in the connection2 code block.PublicFunction CreateTransactionScope( _
  ByVal connectString1 AsString, ByVal connectString2 AsString, _
  ByVal commandText1 AsString, ByVal commandText2 AsString) AsInteger
    ' Initialize the return value to zero and create a StringWriter to display results.Dim returnValue AsInteger = 0
    Dim writer As System.IO.StringWriter = New System.IO.StringWriter

    Try    ' Create the TransactionScope to execute the commands, guaranteeing    '  that both commands can commit or roll back as a single unit of work.Using scope AsNew TransactionScope()
            Using connection1 AsNew SqlConnection(connectString1)
                ' Opening the connection automatically enlists it in the                 ' TransactionScope as a lightweight transaction.
                connection1.Open()

                ' Create the SqlCommand object and execute the first command.Dim command1 As SqlCommand = New SqlCommand(commandText1, connection1)
                returnValue = command1.ExecuteNonQuery()
                writer.WriteLine("Rows to be affected by command1: {0}", returnValue)

                ' If you get here, this means that command1 succeeded. By nesting                ' the using block for connection2 inside that of connection1, you                ' conserve server and network resources as connection2 is opened                ' only when there is a chance that the transaction can commit.   Using connection2 AsNew SqlConnection(connectString2)
                    ' The transaction is escalated to a full distributed                    ' transaction when connection2 is opened.
                    connection2.Open()

                    ' Execute the second command in the second database.
                    returnValue = 0
                    Dim command2 As SqlCommand = New SqlCommand(commandText2, connection2)
                    returnValue = command2.ExecuteNonQuery()
                    writer.WriteLine("Rows to be affected by command2: {0}", returnValue)
                EndUsingEndUsing
        ' The Complete method commits the transaction. If an exception has been thrown,        ' Complete is called and the transaction is rolled back.
        scope.Complete()
        EndUsingCatch ex As TransactionAbortedException
        writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message)
    Catch ex As ApplicationException
        writer.WriteLine("ApplicationException Message: {0}", ex.Message)
    EndTry
    ' Display messages.
    Console.WriteLine(writer.ToString())

    Return returnValue
EndFunction
'Esta função leva argumentos de seqüências de caracteres de conexão e comandos para criar uma transação 2' que envolve dois servidores SQL. Ela retorna um valor > 0 se a transação for confirmada, 0 se a ' transação é lançada Voltar. Para testar esse código, você se pode conecta a dos dois bancos de dados diferentes no mesmo servidor alterando a Cadeia de Caracteres da Conexão, ou para outro terceiros 'RDBMS, alterar o código no Bloquear de código connection2. CreateTransactionScope Público função (_ ByVal connectString1 como String, ByVal connectString2 como String, _ commandText1 ByVal como String, ByVal commandText2 como seqüência de caracteres) As Inteiro
    ' Inicializar o valor de retorno para zero e criar um StringWriter para exibir os resultados. Dim returnValue as Inteiro = 0 gravador Dim comSistema.IO.StringWriter = Sistema.IO.StringWriter novo

    Tente 'Criar o TransactionScope para executar comandos, garantindo' que ambos os comandos podem confirmar ou reverter Voltar como uma única unidade de trabalho. Uso do escopo como novo TransactionScope() usando connection1 como novo SqlConnection(connectString1) ' Abrindo a conexão automaticamente inscreve-lo a ' TransactionScope como uma transação leve. connection1.AAbrir()

                ' Criar o objeto SqlCommand e executar o primeiro comando. Dim command1 como SqlCommand = Novo SqlCommand(commandText1, connection1) returnValue = command1.ExecuteNonQuery() writer.WriteLine("Rows to be affected by command1: ", returnValue) {0}
                ' Se você obtiver aqui, isso significa que command1 bem-sucedida. Por aninhamento ' usando bloquear para connection2 dentro que de connection1, é 'conservar recursos do servidor e rede como connection2 é aberto' somente quando há uma chance de que pode confirmar a transação. Usando connection2 como novo SqlConnection(connectString2) ' A transação é escalonada para Completo distribuídos ' transação quando connection2 é aberto. connection2.AAbrir()
                    ' Executar o comando segundo no segundo banco de dados. returnValue = 0 command2 Dim como SqlCommand = Novo SqlCommand(commandText2, connection2) returnValue = command2.ExecuteNonQuery() writer.WriteLine("Rows to be affected by command2: {0} ", returnValue) end usando end Using
        ' O método Concluir confirma a transação. Se uma exceção foi lançada, ' Concluir é chamada e a transação é lançada Voltar. End Escopo.Concluir() usando Catch ex As TransactionAbortedException writer.WriteLine("TransactionAbortedException Mensagem: {0} ", ex.Mensagem) catch ex as ApplicationException writer.WriteLine("ApplicationException Mensagem: {0} ", ex.Mensagem) end Try
    ' Exibir mensagens. Console.WriteLine(Writer.ToString())

    Retornar returnValue End Função


System.Object
  System.Transactions.TransactionScope

Esse tipo é segmento seguro.

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

o.NET Framework e.NET Compact Framework não oferecem suporte a todas as versões de cada plataforma. Para obter uma lista de versões suportadas, consulte Requisitos de sistema do .NET framework.

.NET Framework

Compatível com: 3.5, 3.0, 2.0
Isso foi útil para você?
(1500 caracteres restantes)
Agradecemos os seus comentários

Contribuições da comunidade

ADICIONAR
Mostrar:
© 2014 Microsoft. Todos os direitos reservados.