about_Transactions

Aplica-se a: Windows PowerShell 2.0, Windows PowerShell 3.0

TÓPICO

about_Transactions

DESCRIÇÃO BREVE

Descreve como gerenciar as operações transacionadas no Windows PowerShell®.

DESCRIÇÃO LONGA

As transações são compatíveis com o Windows PowerShell a partir do Windows PowerShell 2.0. Esse recurso permite que você inicie uma transação, indique quais comandos fazem parte da transação e confirme ou reverta uma transação.

SOBRE TRANSAÇÕES

No Windows PowerShell, uma transação é um conjunto de um ou mais comandos que são gerenciados como uma unidade lógica. Uma transação pode ser concluída ("confirmada"), o que altera os dados afetados pela transação. Ou uma transação pode ser desfeita completamente ("revertida") para que os dados afetados não sejam alterados pela transação.

Já que os comandos de uma transação são gerenciados como uma unidade, todos os comandos serão confirmados ou revertidos.

As transações são amplamente usadas no processamento de dados, especialmente em operações de banco de dados e para transações financeiras. As transações são usadas com mais frequência quando a pior hipóteses para um conjunto de comandos não é sua falha, mas sim o êxito de alguns e falha de outros, deixando o sistema em um estado danificado, falso ou impossível de interpretar, o que é difícil de reparar.

CMDLETS DAS TRANSAÇÕES

O Windows PowerShell inclui vários cmdlets desenvolvidos para gerenciar transações.

      Cmdlet                 Description
      --------------         ---------------------------------    
      Start-Transaction      Starts a new transaction. 

      Use-Transaction        Adds a command or expression to the
                             transaction. The command must use
                             transaction-enabled objects.

      Undo-Transaction       Rolls back the transaction so that
                             no data is changed by the transaction.

      Complete-Transaction   Commits the transaction. The data
                             affected by the transaction is changed.

      Get-Transaction        Gets information about the active
                             transaction.

Para obter uma lista dos cmdlets das transações, digite:

          get-command *transaction

Para obter informações detalhadas sobre os cmdlets, digite:

          get-help <cmdlet-name> -detailed

Por exemplo:

          get-help use-transaction -detailed

ELEMENTOS HABILITADOS PARA TRANSAÇÃO

Para participar de uma transação, o cmdlet e o provedor devem dar suporte a transações. Esse recurso é integrado aos objetos que são afetados pela transação.

O provedor de Registro do Windows PowerShell dá suporte a transações no Windows Vista. O objeto TransactedString (Microsoft.PowerShell.Commands.Management.TransactedString) funciona com qualquer sistema operacional que execute o Windows PowerShell.

Outros provedores do Windows PowerShell podem dar suporte a transações. Para localizar os provedores do Windows PowerShell em sua sessão que dão suporte a transações, use o seguinte comando para encontrar o valor "Transactions" na propriedade Capabilities dos provedores:

        get-psprovider | where {$_.Capabilities -like "*transactions*"}

Para obter mais informações sobre um provedor, consulte a ajuda para o provedor. Para obter ajuda para o provedor, digite:

        get-help <provider-name>

Por exemplo, para obter ajuda para o provedor de Registro, digite:

        get-help registry

O PARÂMETRO USETRANSACTION

Os cmdlets que dão suporte a transações têm um parâmetro UseTransaction. Esse parâmetro inclui o comando na transação ativa. Você pode usar o nome completo do parâmetro ou seu alias, "usetx".

O parâmetro somente pode ser usado quando a sessão contiver uma transação ativa. Se você inserir um comando com o parâmetro UseTransaction quando não houver uma transação ativa, o comando falhará.

Para localizar cmdlets com o parâmetro UseTransaction, digite:

        get-help * -parameter UseTransaction

No núcleo do Windows PowerShell, todos os cmdlets projetados para funcionar com os provedores do Windows PowerShell dão suporte a transações. Como resultado, você pode usar os cmdlets do provedor para gerenciar transações.

Para obter mais informações sobre os provedores do Windows PowerShell, consulte about_Providers.

O OBJETO TRANSACTION

As transações são representadas no Windows PowerShell por um objeto de transação, o System.Management.Automation.Transaction.

O objeto tem as seguintes propriedades:

RollbackPreference:

Contém a preferência de reversão configurada para a transação atual. Você pode configurar a preferência de reversão ao usar Start-Transaction para iniciar a transação.

A preferência de reversão determina as condições nas quais a transação será revertida automaticamente. Os valores válidos são Error, TerminatingError e Never. O valor padrão é Error.

Status:

Contém o status atual da transação. Os valores válidos são Active, Committed e RolledBack.

SubscriberCount:

Contém o número de assinantes da transação. Um assinante é adicionado a uma transação quando você iniciar uma transação enquanto outra estiver em andamento. A contagem de assinantes diminui quando um assinante confirmar a transação.

TRANSAÇÕES ATIVAS

No Windows PowerShell, somente uma transação fica ativa por vez, e você só pode gerenciar a transação ativa. Várias transações podem estar em andamento na mesma sessão ao mesmo tempo, mas só a transação iniciada mais recentemente estará ativa.

Como resultado, você não pode especificar uma transação específica ao usar os cmdlets de transação. Os comandos sempre se aplicam à transação ativa.

Isso fica mais evidente no comportamento do cmdlet Get-Transaction. Quando você insere um comando Get-Transaction, ele sempre obterá apenas um objeto de transação. Esse é o objeto que representa a transação ativa.

Para gerenciar uma transação diferente, você deve concluir a transação ativa primeiro confirmando-a ou revertendo-a. Ao fazer isso, a transação anterior ficará ativa automaticamente. As transações ficam ativas na ordem inversa na qual foram iniciados, para que a transação iniciada mais recentemente esteja sempre ativa.

ASSINANTES E TRANSAÇÕES INDEPENDENTES

Se você iniciar uma transação enquanto outra estiver em andamento, por padrão, o Windows PowerShell não iniciará uma nova transação. Em vez disso, ele adicionará um "assinante" à transação original.

Quando uma transação tiver vários assinantes, um só comando Undo-Transaction em qualquer ponto fará a reversão de toda a transação para todos os assinantes. No entanto, para confirmar a transação, você deve inserir um comando Complete-Transaction para cada assinante.

Para localizar o número de assinantes de uma transação, verifique a propriedade SubscriberCount do objeto de transação. Por exemplo, o comando a seguir usa o cmdlet Get-Transaction para obter o valor da propriedade SubscriberCount da transação ativa:

          (Get-Transaction).SubscriberCount

Adicionar um assinante é o comportamento padrão, já que a maioria das transações que são iniciadas enquanto outra está em andamento é relacionada à transação original. No modelo típico, um script que contenha uma transação chama um script auxiliar que contém sua própria transação. Já que as transações estão relacionadas, elas devem ser revertidas ou confirmadas como uma unidade. Insira o corpo da seção aqui.

No entanto, você pode iniciar uma transação que seja independente da transação atual usando o parâmetro Independent do cmdlet Start-Transaction.

Ao iniciar uma transação independente, o Start-Transaction cria um novo objeto de transação, e a nova transação se torna a transação ativa. A transação independente pode ser confirmada ou revertida sem afetar a transação original.

Quando a transação independente for concluída (confirmada ou revertida), a transação original torna-se a transação ativa novamente.

ALTERAÇÃO DOS DADOS

Quando você usa transações para alterar os dados, os dados que são afetados pela transação não serão alterados até que você confirme a transação. No entanto, os mesmos dados podem ser alterados por comandos que não fazem parte da transação.

Lembre-se disso ao usar transações para gerenciar dados compartilhados. Normalmente, os bancos de dados têm mecanismos que bloqueiam os dados enquanto você estiver trabalhando neles, impedindo que outros usuários e outros comandos, scripts e funções os alterem.

No entanto, o bloqueio é um recurso do banco de dados. Ele não está relacionado às transações. Se você estiver trabalhando em um sistema de arquivos habilitado para transações ou outro armazenamento de dados, os dados podem ser alterados enquanto a transação estiver em andamento.

EXEMPLOS

Os exemplos desta seção usam o provedor de Registro do Windows PowerShell e supõem que você esteja familiarizado com ele. Para obter informações sobre o provedor de Registro, digite "get-help registry".

EXEMPLO 1: COMO CONFIRMAR UMA TRANSAÇÃO

Para criar uma transação, use o cmdlet Start-Transaction. O comando a seguir inicia uma transação com as configurações padrão.

        start-transaction

Para incluir comandos na transação, use o parâmetro UseTransaction do cmdlet. Por padrão, os comandos não são incluídos na transação.

Por exemplo, o seguinte comando, que configura o local atual da chave Software da unidade HKCU:, não está incluído na transação.

        cd hkcu:\Software

O comando a seguir, que cria a chave MyCompany, usa o parâmetro UseTransaction do cmdlet New-Item para incluir o comando na transação ativa.

        new-item MyCompany -UseTransaction

O comando retorna um objeto que representa a nova chave, mas como o comando faz parte da transação, o Registro ainda não será alterado.

        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
          0   0 MyCompany                      {}

Para confirmar a transação, use o cmdlet Complete-Transaction. Já que ele sempre afeta a transação ativa, você não poderá especificar a transação.

        complete-transaction

Como resultado, a chave MyCompany será adicionada ao Registro.

        dir m*
       
        Hive: HKEY_CURRENT_USER\software

        SKC  VC Name                           Property
        ---  -- ----                           --------
         83   1 Microsoft                      {(default)}
          0   0 MyCompany                      {}

EXEMPLO 2: COMO REVERTER UMA TRANSAÇÃO

Para criar uma transação, use o cmdlet Start-Transaction. O comando a seguir inicia uma transação com as configurações padrão.

        start-transaction

O comando a seguir, que cria a chave MyOtherCompany, usa o parâmetro UseTransaction do cmdlet New-Item para incluir o comando na transação ativa.

        new-item MyOtherCompany -UseTransaction

O comando retorna um objeto que representa a nova chave, mas como o comando faz parte da transação, o registro ainda não será alterado.

        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
          0   0 MyOtherCompany                 {}

Para reverter a transação, use o cmdlet Undo-Transaction. Já que ele sempre afeta a transação ativa, você não poderá especificar a transação.

        Undo-transaction

O resultado é que a chave MyOtherCompany não será adicionada ao Registro.

        dir m*
       
        Hive: HKEY_CURRENT_USER\software

        SKC  VC Name                           Property
        ---  -- ----                           --------
         83   1 Microsoft                      {(default)}
          0   0 MyCompany                      {}

EXEMPLO 3: COMO VISUALIZAR UMA TRANSAÇÃO

Normalmente, os comandos usados em uma transação alteram os dados. No entanto, os comandos que obtêm os dados também são úteis em uma transação porque obtêm os dados dentro da transação. Isso oferece uma visualização das alterações que a confirmação da transação causaria.

O exemplo a seguir mostra como usar o comando Get-ChildItem (o alias é "dir") para visualizar as alterações de‎ uma transação.

O seguinte comando inicia uma transação.

        start-transaction

O comando a seguir usa o cmdlet New-ItemProperty para adicionar a entrada de Registro MyKey à chave MyCompany. O comando usa o parâmetro UseTransaction para incluir o comando na transação.

        new-itemproperty -path MyCompany -Name MyKey -value 123 -UseTransaction

O comando retorna um objeto que representa a nova entrada de Registro, mas a entrada do Registro não é alterada.

        MyKey
        -----
        123

Para obter os itens que estão atualmente no Registro, use um comando Get-ChildItem ("dir") sem o parâmetro UseTransaction. O comando a seguir obtém os itens que começam com "M".

        dir m*

O resultado mostra que ainda não foram adicionadas entradas à chave MyCompany.

        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
        83   1 Microsoft                      {(default)}
         0   0 MyCompany                      {}

Para visualizar o efeito da confirmação da transação, insira um comando Get-ChildItem ("dir") com o parâmetro UseTransaction. Este comando apresenta uma exibição dos dados de dentro da transação. Insira o corpo da seção aqui.

        dir m* -useTransaction

O resultado mostra que, se a transação for confirmada, a entrada MyKey será adicionada à chave MyCompany.

        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
        83   1 Microsoft                      {(default)}
         0   1 MyCompany                      {MyKey}

EXEMPLO 4: COMO COMBINAR COMANDOS TRANSACIONADOS E NÃO TRANSACIONADOS

Você pode inserir comandos não transacionados durante uma transação. Os comandos não transacionados afetam os dados imediatamente, mas não afetam a transação.

O comando a seguir inicia uma transação na chave do Registro HKCU:\Software.

        start-transaction

Os próximos três comandos usam o cmdlet New-Item para adicionar chaves ao Registro. O primeiro e o terceiro comando usam o parâmetro UseTransaction para incluir os comandos na transação. O segundo comando omite o parâmetro. Já que o segundo comando não está incluído na transação, ele entrará em vigor imediatamente.

        new-item MyCompany1 -UseTransaction

        new-item MyCompany2

        new-item MyCompany3 -UseTransaction

Para exibir o estado atual do Registro, use um comando Get-ChildItem ("dir") sem o parâmetro UseTransaction. Este comando obtém os itens que começam com "M".

        dir m*

O resultado mostra que a chave MyCompany2 foi adicionada ao Registro, mas as chaves MyCompany1 e MyCompany3, que fazem parte da transação, não foram adicionadas.

        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
        83   1 Microsoft                      {(default)}
        0    0 MyCompany2                     {}

O comando a seguir confirma a transação.

        complete-transaction

Agora, as chaves que foram adicionadas como parte da transação aparecem no Registro.

        dir m*

     
        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
        83   1 Microsoft                      {(default)}
        0    0 MyCompany1                     {}
        0    0 MyCompany2                     {}
        0    0 MyCompany3                     {}

EXEMPLO 5: COMO USAR A REVERSÃO AUTOMÁTICA

Quando um comando de uma transação gera um erro de qualquer tipo, a transação é revertida automaticamente.

Esse comportamento padrão foi desenvolvido para scripts que executam transações. Geralmente, os scripts são bem testados e incluem lógica de tratamento de erros; portanto, os erros não são esperados e devem encerrar a transação.

O primeiro comando inicia uma transação na chave do Registro HKCU:\Software.

        start-transaction

O comando a seguir usa o cmdlet New-Item para adicionar a chave MyCompany ao Registro. O comando usa o parâmetro UseTransaction (o alias é "usetx") para incluir o comando na transação.

        New-Item MyCompany -UseTX

Já que a chave MyCompany já existe no Registro, o comando falhará e a transação será revertida.

        New-Item : A key at this path already exists
        At line:1 char:9
        + new-item <<<<  MyCompany -usetx

Um comando Get-Transaction confirma que a transação foi revertida e que o SubscriberCount é 0.

        RollbackPreference   SubscriberCount   Status
        ------------------   ---------------   ------
        Error                0                 RolledBack

EXEMPLO 6: COMO ALTERAR A PREFERÊNCIA DE REVERSÃO

Se você deseja que a transação seja mais tolerante a erros, poderá usar o parâmetro RollbackPreference do Start-Transaction para alterar a preferência.

O comando a seguir inicia uma transação com uma preferência de reversão de "Never". Insira o corpo da seção aqui.

         start-transaction -rollbackpreference Never

Nesse caso, quando o comando falhar, a transação não será revertida automaticamente.

        New-Item MyCompany -UseTX

        New-Item : A key at this path already exists
        At line:1 char:9
        + new-item <<<<  MyCompany -usetx

Já que a transação ainda estará ativa, você pode reenviar o comando como parte da transação.

        New-Item MyOtherCompany -UseTX

EXEMPLO 7: COMO USAR O CMDLET USE-TRANSACTION

O cmdlet Use-Transaction permite que você faça o script direto em relação aos objetos Microsoft .NET Framework habilitados para transações. O Use-Transaction usa um bloco de script que pode conter somente os comandos e expressões que usam objetos do .NET Framework habilitados para transações, como instâncias da classe Microsoft.PowerShell.Commands.Management.TransactedString.

O seguinte comando inicia uma transação.

         start-transaction

O comando New-Object a seguir cria uma instância da classe TransactedString e a salva na variável $t.

         $t = New-Object Microsoft.PowerShell.Commands.Management.TransactedString

O comando a seguir usa o método Append do objeto TransactedString para adicionar texto à cadeia de caracteres. Já que o comando não faz parte da transação, a alteração entrará em vigor imediatamente.

        $t.append("Windows")

O comando a seguir usa o mesmo método Append para adicionar texto, mas adiciona o texto como parte da transação. O comando é colocado entre chaves e é configurado como o valor do parâmetro ScriptBlock do Use-Transaction. O parâmetro UseTransaction (UseTx) é necessário.

        use-transaction {$t.append(" PowerShell")} -usetx

Para ver o conteúdo atual da cadeia de caracteres transacionada em $t, use o método ToString do objeto TransactedString.

        $t.tostring()

A saída mostra que apenas as alterações não transacionadas entraram em vigor.

        Windows

Para ver o conteúdo atual da cadeia de caracteres transacionada em $t de dentro da transação, insira a expressão em um comando Use-Transaction.

        use-transaction {$s.tostring()} -usetx

A saída mostra a exibição da transação.

        Windows PowerShell

O comando a seguir confirma a transação.

        complete-transaction

Para ver a cadeia de caracteres final:

        $t.tostring()

        Windows PowerShell

EXEMPLO 7: COMO GERENCIAR TRANSAÇÕES COM VÁRIOS ASSINANTES

Quando você iniciar uma transação enquanto outra estiver em andamento, o Windows PowerShell não criará uma segunda transação por padrão. Em vez disso, ele adicionará um assinante à transação atual.

Este exemplo mostra como exibir e gerenciar uma transação com vários assinantes.

Comece iniciando uma transação na chave HKCU:\Software.

        start-transaction

O comando a seguir usa o comando Get-Transaction para obter a transação ativa.

        get-transaction

O resultado mostra o objeto que representa a transação ativa.

        RollbackPreference   SubscriberCount   Status
        ------------------   ---------------   ------
        Error                1                 Active

O comando a seguir adiciona a chave MyCompany ao Registro. O comando usa o parâmetro UseTransaction para incluir o comando na transação.

        new-item MyCompany -UseTransaction

O comando a seguir utiliza o comando Start-Transaction para iniciar uma transação. Embora esse comando seja digitado no prompt de comando, provavelmente, essa situação acontecerá quando você executar um script que contenha uma transação.

        start-transaction

Um comando Get-Transaction mostra que a contagem de assinantes do objeto de transação aumentou. Agora, o valor é 2.

        RollbackPreference   SubscriberCount   Status
        ------------------   ---------------   ------
        Error                2                 Active

O próximo comando usa o cmdlet New-ItemProperty para adicionar a entrada de Registro MyKey à chave MyCompany. Ele usa o parâmetro UseTransaction para incluir o comando na transação.

        new-itemproperty -path MyCompany -name MyKey -UseTransaction

A chave MyCompany não existe no Registro, mas esse comando é bem-sucedida porque os dois comandos fazem parte da mesma transação.

O comando a seguir confirma a transação. Se ele revertesse a transação, a transação seria revertida para todos os assinantes.

        complete-transaction

Um comando Get-Transaction mostra que a contagem de assinantes do objeto de transação é 1, mas o valor de Status ainda é Active (e não confirmado).

        RollbackPreference   SubscriberCount   Status
        ------------------   ---------------   ------
        Error                1                 Active

Para concluir a confirmação da transação, insira um segundo comando Complete-Transaction. Para confirmar uma transação com vários assinantes, você deve inserir um comando Complete-Transaction para cada comando Start-Transaction.

        complete-transaction

Outro comando Get-Transaction mostra que a transação foi confirmada.

        RollbackPreference   SubscriberCount   Status
        ------------------   ---------------   ------
        Error                0                 Committed

EXEMPLO 8: COMO GERENCIAR TRANSAÇÕES INDEPENDENTES

Quando você iniciar uma transação enquanto outra estiver em andamento, poderá usar o parâmetro Independent do Start-Transaction para tornar a nova transação independente da transação original.

Quando fizer isso, o Start-Transaction criará um novo objeto de transação e tornará a nova transação na transação ativa.

Comece iniciando uma transação na chave HKCU:\Software.

        start-transaction

O comando a seguir usa o comando Get-Transaction para obter a transação ativa.

        get-transaction

O resultado mostra o objeto que representa a transação ativa.

        RollbackPreference   SubscriberCount   Status
        ------------------   ---------------   ------
        Error                1                 Active

O comando a seguir adiciona a chave do Registro MyCompany como parte da transação. Ele usa o parâmetro UseTransaction (UseTx) para incluir o comando na transação ativa.

        new-item MyCompany -use

O comando a seguir inicia uma nova transação. O comando usa o parâmetro Independent para indicar que essa transação não é um assinante da transação ativa.

         start-transaction -independent

Quando você cria uma transação independente, a nova transação (criada mais recentemente) torna-se a transação ativa. Você pode usar um comando Get-Transaction para obter a transação ativa.

        get-transaction

Observe que o SubscriberCount da transação é 1, indicando que não há outros assinantes e que a transação é nova.

        RollbackPreference   SubscriberCount   Status
        ------------------   ---------------   ------
        Error                1                 Active

A nova transação deve ser concluída (confirmada ou revertida) para que você possa gerenciar a transação original.

O comando a seguir adiciona a chave MyOtherCompany ao Registro. Ele usa o parâmetro UseTransaction (UseTx) para incluir o comando na transação ativa.

        new-item MyOtherCompany -usetx

Agora, reverta a transação. Se houvesse uma só transação com dois assinantes, a reversão da transação reverteria toda a transação para todos os assinantes.

No entanto, já que essas transações são independentes, a reversão da transação mais recente cancela as alterações no Registro e torna a transação original na transação ativa.

        undo-transaction

Um comando Get-Transaction confirma que a transação original ainda está ativa na sessão.

        get-transaction
        RollbackPreference   SubscriberCount   Status
        ------------------   ---------------   ------
        Error                1                 Active

O comando a seguir confirma a transação ativa.

        complete-transaction

Um comando Get-ChildItem mostra que o Registro foi alterado.

        dir m*


        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
        83   1 Microsoft                      {(default)}
         0   0 MyCompany                      {}

CONSULTE TAMBÉM

Start-Transaction

Get-Transaction

Complete-Transaction

Undo-Transaction

Use-Transaction

Registro (provedor)

about_Providers

Get-PSProvider

Get-ChildItem