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 {}