Partilhar via


Acerca das Transações

BREVE DESCRIÇÃO

Descreve como gerir operações transacionadas no PowerShell.

DESCRIÇÃO LONGA

As transações são suportadas no PowerShell a partir do PowerShell 2.0. Esta funcionalidade permite-lhe iniciar uma transação, indicar que comandos fazem parte da transação e consolidar ou reverter uma transação.

SOBRE TRANSAÇÕES

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

Uma vez que os comandos numa transação são geridos como uma unidade, todos os comandos são consolidados ou todos os comandos são revertidos.

As transações são amplamente utilizadas no processamento de dados, nomeadamente em operações de bases de dados e em transações financeiras. As transações são frequentemente utilizadas quando o pior cenário para um conjunto de comandos não é que todos falhem, mas sim que alguns comandos sejam bem-sucedidos enquanto outros falham, deixando o sistema num estado danificado, falso ou ininterpretável que é difícil de reparar.

CMDLETS DE TRANSAÇÃO

O PowerShell inclui vários cmdlets concebidos para gerir transações.

  • Start-Transaction: inicia uma nova transação.
  • Use-Transaction: adiciona um comando ou expressão à transação. O comando tem de utilizar objetos com capacidade de transação.
  • Anular-Transação: reverte a transação para que não sejam alterados dados pela transação.
  • Complete-Transaction: consolida a transação. Os dados afetados pela transação são alterados.
  • Get-Transaction: obtém informações sobre a transação ativa.

Para obter uma lista de cmdlets de transação, escreva:

get-command *transaction

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

get-help use-transaction -detailed

ELEMENTOS COM CAPACIDADE DE TRANSAÇÃO

Para participar numa transação, tanto o cmdlet como o fornecedor têm de suportar transações. Esta funcionalidade está incorporada nos objetos que são afetados pela transação.

O fornecedor de Registo do PowerShell suporta transações no Windows Vista. O objeto TransactedString (Microsoft.PowerShell.Commands.Management.TransactedString) funciona com qualquer sistema operativo que execute o PowerShell.

Outros fornecedores do PowerShell podem suportar transações. Para localizar os fornecedores do PowerShell na sua sessão que suportam transações, utilize o seguinte comando para localizar o valor "Transações" na propriedade Capacidades dos fornecedores:

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

Para obter mais informações sobre um fornecedor, consulte a Ajuda do fornecedor. Para obter a Ajuda do fornecedor, escreva:

get-help <provider-name>

Por exemplo, para obter Ajuda para o fornecedor de Registo, escreva:

get-help registry

O PARÂMETRO USETRANSACTION

Os cmdlets que podem suportar transações têm um parâmetro UseTransaction. Este parâmetro inclui o comando na transação ativa. Pode utilizar o nome completo do parâmetro ou o respetivo alias, "usetx".

O parâmetro só pode ser utilizado quando a sessão contém uma transação ativa. Se introduzir um comando com o parâmetro UseTransaction quando não existe nenhuma transação ativa, o comando falha.

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

get-help * -parameter UseTransaction

No PowerShell Core, todos os cmdlets concebidos para funcionar com fornecedores do PowerShell suportam transações. Como resultado, pode utilizar os cmdlets do fornecedor para gerir transações.

Para obter mais informações sobre os fornecedores do PowerShell, veja about_Providers.

O OBJETO TRANSAÇÃO

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

O objeto tem as seguintes propriedades:

  • RollbackPreference: contém o conjunto de preferências de reversão para a transação atual. Pode definir a preferência de reversão quando utiliza Start-Transaction para iniciar a transação.

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

  • Estado: contém o estado atual da transação. Os valores válidos são Ativo, Consolidado e Reversão.

  • SubscriberCount: contém o número de subscritores da transação. Um subscritor é adicionado a uma transação quando inicia uma transação enquanto outra transação está em curso. A contagem de subscritores é decrementada quando um subscritor consolida a transação.

TRANSAÇÕES ATIVAS

No PowerShell, apenas uma transação está ativa de cada vez e só pode gerir a transação ativa. Várias transações podem estar em curso na mesma sessão ao mesmo tempo, mas apenas a transação iniciada mais recentemente está ativa.

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

Isto é mais evidente no comportamento do cmdlet Get-Transaction. Quando introduz um comando Get-Transaction, Get-Transaction obtém sempre apenas um objeto de transação. Este objeto é o objeto que representa a transação ativa.

Para gerir uma transação diferente, primeiro tem de concluir a transação ativa ao consolidar ou reverter a transação. Ao fazê-lo, a transação anterior fica ativa automaticamente. As transações tornam-se ativas na ordem inversa da qual são iniciadas, para que a transação iniciada mais recentemente esteja sempre ativa.

SUBSCRITORES E TRANSAÇÕES INDEPENDENTES

Se iniciar uma transação enquanto outra transação estiver em curso, por predefinição, o PowerShell não inicia uma nova transação. Em vez disso, adiciona um "subscritor" à transação atual.

Quando uma transação tem vários subscritores, um único comando de Undo-Transaction em qualquer ponto reverte toda a transação para todos os subscritores. No entanto, para consolidar a transação, tem de introduzir um comando Complete-Transaction para cada subscritor.

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

(Get-Transaction).SubscriberCount

Adicionar um subscritor é o comportamento predefinido porque a maioria das transações iniciadas enquanto outra transação está em curso estão relacionadas com a transação original. No modelo típico, um script que contém uma transação chama um script auxiliar que contém a sua própria transação. Uma vez que as transações estão relacionadas, devem ser revertidas ou consolidadas como uma unidade.

No entanto, pode iniciar uma transação independente da transação atual com o parâmetro Independente do cmdlet Start-Transaction.

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

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

ALTERAR DADOS

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

Tenha isto em mente quando estiver a utilizar transações para gerir dados partilhados. Normalmente, as bases de dados têm mecanismos que bloqueiam os dados enquanto está a trabalhar nos mesmos, impedindo que outros utilizadores e outros comandos, scripts e funções os alterem.

No entanto, o bloqueio é uma funcionalidade da base de dados. Não está relacionado com transações. Se estiver a trabalhar num sistema de ficheiros com capacidade de transação ou noutro arquivo de dados, os dados podem ser alterados enquanto a transação estiver em curso.

EXEMPLOS

Os exemplos nesta secção utilizam o fornecedor de Registo do PowerShell e partem do princípio de que está familiarizado com o mesmo. Para obter informações sobre o Fornecedor de registo, escreva "get-help registry".

EXEMPLO 1: CONSOLIDAR UMA TRANSAÇÃO

Para criar uma transação, utilize o cmdlet Start-Transaction. O comando seguinte inicia uma transação com as predefinições.

start-transaction

Para incluir comandos na transação, utilize o parâmetro UseTransaction do cmdlet . Por predefinição, os comandos não estão incluídos na transação,

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

cd hkcu:\Software

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

new-item MyCompany -UseTransaction

O comando devolve um objeto que representa a nova chave, mas como o comando faz parte da transação, o registo ainda não foi alterado.

Hive: HKEY_CURRENT_USER\Software

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

Para consolidar a transação, utilize o cmdlet Complete-Transaction. Uma vez que afeta sempre a transação ativa, não pode especificar a transação.

complete-transaction

Como resultado, a chave MyCompany é adicionada ao registo.

dir m*
Hive: HKEY_CURRENT_USER\software

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

EXEMPLO 2: REVERTER UMA TRANSAÇÃO

Para criar uma transação, utilize o cmdlet Start-Transaction. O comando seguinte inicia uma transação com as predefinições.

start-transaction

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

new-item MyOtherCompany -UseTransaction

O comando devolve um objeto que representa a nova chave, mas como o comando faz parte da transação, o registo ainda não foi alterado.

Hive: HKEY_CURRENT_USER\Software

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

Para reverter a transação, utilize o cmdlet Undo-Transaction. Uma vez que afeta sempre a transação ativa, não especifica a transação.

Undo-transaction

O resultado é que a chave MyOtherCompany não é adicionada ao registo.

dir m*
Hive: HKEY_CURRENT_USER\software

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

EXEMPLO 3: PRÉ-VISUALIZAR UMA TRANSAÇÃO

Normalmente, os comandos utilizados numa transação alteram os dados. No entanto, os comandos que obtêm dados também são úteis numa transação, uma vez que obtêm dados dentro da transação. Isto fornece uma pré-visualização das alterações que a consolidação da transação causaria.

O exemplo seguinte mostra como utilizar o comando Get-ChildItem (o alias é "dir") para pré-visualizar as alterações numa transação.

O comando seguinte inicia uma transação.

start-transaction

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

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

O comando devolve um objeto que representa a nova entrada de registo, mas a entrada de registo não é alterada.

MyKey
-----
123

Para obter os itens que estão atualmente no registo, utilize um comando Get-ChildItem ("dir") sem o parâmetro UseTransaction. O comando seguinte obtém 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 pré-visualizar o efeito da consolidação da transação, introduza um comando Get-ChildItem ("dir") com o parâmetro UseTransaction. Este comando tem uma vista dos dados a partir da transação.

dir m* -useTransaction

O resultado mostra que, se a transação for consolidada, 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: COMBINAR COMANDOS TRANSACIONADOS E NÃO TRANSACIONADOS

Pode introduzir 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 seguinte inicia uma transação na chave de registo HKCU:\Software.

start-transaction

Os três comandos seguintes utilizam o cmdlet New-Item para adicionar chaves ao registo. O primeiro e terceiro comandos utilizam o parâmetro UseTransaction para incluir os comandos na transação. O segundo comando omite o parâmetro . Uma vez que o segundo comando não está incluído na transação, entrará em vigor imediatamente.

new-item MyCompany1 -UseTransaction
new-item MyCompany2
new-item MyCompany3 -UseTransaction

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

dir m*

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

Hive: HKEY_CURRENT_USER\Software

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

O comando seguinte consolida a transação.

complete-transaction

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

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: UTILIZAR A REVERSÃO AUTOMÁTICA

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

Este comportamento predefinido foi concebido para scripts que executam transações. Normalmente, os scripts são bem testados e incluem lógica de processamento de erros, pelo que não são esperados erros e devem terminar a transação.

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

start-transaction

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

New-Item MyCompany -UseTX

Uma vez que a chave MyCompany já existe no registo, o comando falha e a transação é 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 a SubscriberCount é 0.

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

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

Se quiser que a transação seja mais tolerante a erros, pode utilizar o parâmetro RollbackPreference de Start-Transaction para alterar a preferência.

O comando seguinte inicia uma transação com uma preferência de reversão de "Nunca".

start-transaction -rollbackpreference Never

Neste caso, quando o comando falha, a transação não é revertida automaticamente.

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

Uma vez que a transação ainda está ativa, pode submeter novamente o comando como parte da transação.

New-Item MyOtherCompany -UseTX

EXEMPLO 7: UTILIZAR O CMDLET USE-TRANSACTION

O cmdlet Use-Transaction permite-lhe efetuar scripts diretos em objetos do Microsoft .NET Framework com capacidade de transação. Use-Transaction utiliza um bloco de script que só pode conter comandos e expressões que utilizam objetos .NET Framework com capacidade de transação, como instâncias da classe Microsoft.PowerShell.Commands.Management.TransactedString.

O comando seguinte inicia uma transação.

start-transaction

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

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

O comando seguinte utiliza o método Append do objeto TransactedString para adicionar texto à cadeia. Uma vez que o comando não faz parte da transação, a alteração tem efeito imediato.

$t.append("Windows")

O comando seguinte utiliza o mesmo método Acrescentar para adicionar texto, mas adiciona o texto como parte da transação. O comando está entre chavetas e é definido como o valor do parâmetro ScriptBlock de Use-Transaction. É necessário o parâmetro UseTransaction (UseTx).

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

Para ver o conteúdo atual da cadeia transacionada no $t, utilize o método ToString do objeto TransactedString.

$t.tostring()

O resultado mostra que apenas as alterações não transacionadas são eficazes.

Windows

Para ver o conteúdo atual da cadeia transacionada no $t a partir da transação, incorpore a expressão num comando Use-Transaction.

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

O resultado mostra a vista de transação.

PowerShell

O comando seguinte consolida a transação.

complete-transaction

Para ver a cadeia final:

$t.tostring()
PowerShell

EXEMPLO 8: GERIR TRANSAÇÕES MULTI-SUBSCRITORES

Quando inicia uma transação enquanto outra transação está em curso, o PowerShell não cria uma segunda transação por predefinição. Em vez disso, adiciona um subscritor à transação atual.

Este exemplo mostra como ver e gerir uma transação de vários subscritores.

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

start-transaction

O comando seguinte utiliza 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 seguinte adiciona a chave MyCompany ao registo. O comando utiliza o parâmetro UseTransaction para incluir o comando na transação.

new-item MyCompany -UseTransaction

O comando seguinte utiliza o comando Start-Transaction para iniciar uma transação. Embora este comando seja escrito na linha de comandos, é mais provável que este cenário aconteça quando executa um script que contém uma transação.

start-transaction

Um comando Get-Transaction mostra que a contagem de subscritores no objeto de transação é incrementada. O valor é agora 2.

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

O comando seguinte utiliza o cmdlet New-ItemProperty para adicionar a entrada de registo MyKey à chave MyCompany. Utiliza 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 registo, mas este comando é bem-sucedido porque os dois comandos fazem parte da mesma transação.

O comando seguinte consolida a transação. Se reverter a transação, a transação será revertida para todos os subscritores.

complete-transaction

Um comando Get-Transaction mostra que a contagem de subscritores no objeto de transação é 1, mas o valor de Estado ainda está Ativo (não Consolidado).

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

Para concluir a consolidação da transação, introduza um segundo comando Complete- Transaction. Para consolidar uma transação multi-subscritor, tem de introduzir um comando Complete-Transaction para cada comando Start-Transaction.

complete-transaction

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

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

EXEMPLO 9: GERIR TRANSAÇÕES INDEPENDENTES

Quando inicia uma transação enquanto outra transação está em curso, pode utilizar o parâmetro Independente de Start-Transaction para tornar a nova transação independente da transação original.

Quando o fizer, Start-Transaction cria um novo objeto de transação e faz da nova transação a transação ativa.

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

start-transaction

O comando seguinte utiliza 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 seguinte adiciona a chave de registo MyCompany como parte da transação. Utiliza o parâmetro UseTransaction (UseTx) para incluir o comando na transação ativa.

new-item MyCompany -use

O comando seguinte inicia uma nova transação. O comando utiliza o parâmetro Independente para indicar que esta transação não é um subscritor da transação ativa.

start-transaction -independent

Quando cria uma transação independente, a transação nova (criada mais recentemente) torna-se a transação ativa. Pode utilizar um comando Get-Transaction para obter a transação ativa.

get-transaction

Tenha em atenção que a SubscriberCount da transação é 1, indicando que não existem outros subscritores e que a transação é nova.

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

A nova transação tem de estar concluída (consolidada ou revertida) antes de poder gerir a transação original.

O comando seguinte adiciona a chave MyOtherCompany ao registo. Utiliza 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 única transação com dois subscritores, reverter a transação reverteria toda a transação para todos os subscritores.

No entanto, como estas transações são independentes, reverter a transação mais recente cancela as alterações do registo e faz da transação original a 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 seguinte consolida a transação ativa.

complete-transaction

Um comando Get-ChildItem mostra que o registo 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

Get-PSProvider

Get-ChildItem

about_Providers