about_Transactions

Descrizione breve

Descrive come gestire le operazioni transazionate in PowerShell.

Descrizione lunga

Le transazioni sono supportate in PowerShell a partire da PowerShell 2.0. Questa funzionalità consente di avviare una transazione, di indicare quali comandi fanno parte della transazione e di eseguire il commit o il rollback di una transazione.

INFORMAZIONI SULLE TRANSAZIONI

In PowerShell una transazione è un set di uno o più comandi gestiti come unità logica. Una transazione può essere completata ("commit"), che modifica i dati interessati dalla transazione. In alternativa, una transazione può essere annullata completamente ("rollback") in modo che i dati interessati non vengano modificati dalla transazione.

Poiché i comandi in una transazione vengono gestiti come unità, viene eseguito il commit di tutti i comandi o viene eseguito il rollback di tutti i comandi.

Le transazioni sono ampiamente utilizzate nell'elaborazione dei dati, in particolare nelle operazioni di database e per le transazioni finanziarie. Le transazioni vengono spesso usate quando lo scenario peggiore per un set di comandi non è che tutti hanno esito negativo, ma che alcuni comandi hanno esito positivo mentre altri hanno esito negativo, lasciando il sistema in uno stato danneggiato, false o non interpretabile che è difficile da ripristinare.

CMDLET TRANSACTION

PowerShell include diversi cmdlet progettati per la gestione delle transazioni.

  • Start-Transaction: avvia una nuova transazione.
  • Use-Transaction: aggiunge un comando o un'espressione alla transazione. Il comando deve usare oggetti abilitati per la transazione.
  • Annulla transazione: esegue il rollback della transazione in modo che nessun dato venga modificato dalla transazione.
  • Complete-Transaction: esegue il commit della transazione. I dati interessati dalla transazione sono stati modificati.
  • Get-Transaction: ottiene informazioni sulla transazione attiva.

Per un elenco di cmdlet delle transazioni, digitare:

get-command *transaction

Per informazioni dettagliate sui cmdlet, digitare:

get-help use-transaction -detailed

ELEMENTI ABILITATI PER LE TRANSAZIONI

Per partecipare a una transazione, sia il cmdlet che il provider devono supportare le transazioni. Questa funzionalità è incorporata negli oggetti interessati dalla transazione.

Il provider del Registro di sistema di PowerShell supporta le transazioni in Windows Vista. L'oggetto TransactedString (Microsoft.PowerShell.Commands.Management.TransactedString) funziona con qualsiasi sistema operativo che esegue PowerShell.

Altri provider di PowerShell possono supportare le transazioni. Per trovare i provider di PowerShell nella sessione che supportano le transazioni, usare il comando seguente per trovare il valore "Transactions" nella proprietà Capabilities dei provider:

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

Per altre informazioni su un provider, vedere la Guida per il provider. Per ottenere la Guida del provider, digitare:

get-help <provider-name>

Per visualizzare ad esempio la Guida per il provider del Registro di sistema, digitare:

get-help registry

PARAMETRO U edizione Standard TRANSACTION

I cmdlet che possono supportare le transazioni hanno un parametro UseTransaction. Questo parametro include il comando nella transazione attiva. È possibile usare il nome completo del parametro o il relativo alias , "usetx".

Il parametro può essere utilizzato solo quando la sessione contiene una transazione attiva. Se si immette un comando con il parametro UseTransaction quando non è presente alcuna transazione attiva, il comando non riesce.

Per trovare i cmdlet con il parametro UseTransaction, digitare:

get-help * -parameter UseTransaction

In PowerShell core tutti i cmdlet progettati per l'uso con i provider di PowerShell supportano le transazioni. Di conseguenza, è possibile usare i cmdlet del provider per gestire le transazioni.

Per altre informazioni sui provider di PowerShell, vedere about_Providers.

OGGETTO TRANSACTION

Le transazioni vengono rappresentate in PowerShell da un oggetto transazione System.Management.Automation.Transaction.

Di seguito sono elencate le proprietà dell'oggetto :

  • RollbackPreference: contiene le preferenze di rollback impostate per la transazione corrente. È possibile impostare la preferenza di rollback quando si usa Start-Transaction per avviare la transazione.

    La preferenza di rollback determina le condizioni in cui viene eseguito automaticamente il rollback della transazione. I valori validi sono Error, TerminatingError e Never. Il valore predefinito è Error.

  • Stato: contiene lo stato corrente della transazione. I valori validi sono Active, Committed e RolledBack.

  • SubscriberCount: contiene il numero di sottoscrittori della transazione. Un sottoscrittore viene aggiunto a una transazione quando si avvia una transazione mentre è in corso un'altra transazione. Il numero di sottoscrittori viene decrementato quando un sottoscrittore esegue il commit della transazione.

TRANSAZIONI ATTIVE

In PowerShell una sola transazione è attiva alla volta ed è possibile gestire solo la transazione attiva. Più transazioni possono essere in corso nella stessa sessione contemporaneamente, ma solo la transazione avviata più di recente è attiva.

Di conseguenza, non è possibile specificare una determinata transazione quando si usano i cmdlet delle transazioni. I comandi si applicano sempre alla transazione attiva.

Ciò è più evidente nel comportamento del cmdlet Get-Transaction. Quando si immette un comando Get-Transaction, Get-Transaction ottiene sempre un solo oggetto transazione. Questo oggetto è l'oggetto che rappresenta la transazione attiva.

Per gestire una transazione diversa, è necessario prima completare la transazione attiva, eseguendone il commit o eseguendone il rollback. Quando si esegue questa operazione, la transazione precedente diventa attiva automaticamente. Le transazioni diventano attive nell'ordine inverso di cui vengono avviate, in modo che la transazione avviata più di recente sia sempre attiva.

SOTTOSCRITTORI E TRANSAZIONI INDIPENDENTI

Se si avvia una transazione mentre è in corso un'altra transazione, per impostazione predefinita PowerShell non avvia una nuova transazione. Aggiunge invece un "sottoscrittore" alla transazione corrente.

Quando una transazione dispone di più sottoscrittori, un singolo comando Undo-Transaction in qualsiasi punto esegue il rollback dell'intera transazione per tutti i sottoscrittori. Tuttavia, per eseguire il commit della transazione, è necessario immettere un comando Complete-Transaction per ogni sottoscrittore.

Per trovare il numero di sottoscrittori di una transazione, controllare la proprietà SubscriberCount dell'oggetto transazione. Ad esempio, il comando seguente usa il cmdlet Get-Transaction per ottenere il valore della proprietà SubscriberCount della transazione attiva:

(Get-Transaction).SubscriberCount

L'aggiunta di un sottoscrittore è il comportamento predefinito perché la maggior parte delle transazioni avviate mentre è in corso un'altra transazione è correlata alla transazione originale. Nel modello tipico, uno script che contiene una transazione chiama uno script helper che contiene la propria transazione. Poiché le transazioni sono correlate, è necessario eseguire il rollback o il commit come unità.

È tuttavia possibile avviare una transazione indipendente dalla transazione corrente usando il parametro Independent del cmdlet Start-Transaction.

Quando si avvia una transazione indipendente, Start-Transaction crea un nuovo oggetto transazione e la nuova transazione diventa la transazione attiva. È possibile eseguire il commit o il rollback della transazione indipendente senza influire sulla transazione originale.

Al termine della transazione indipendente (commit o rollback), la transazione originale diventa nuovamente la transazione attiva.

MODIFICA DEI DATI

Quando si usano transazioni per modificare i dati, i dati interessati dalla transazione non vengono modificati fino a quando non si esegue il commit della transazione. Tuttavia, gli stessi dati possono essere modificati dai comandi che non fanno parte della transazione.

Tenere presente questo aspetto quando si usano transazioni per gestire i dati condivisi. In genere, i database dispongono di meccanismi che bloccano i dati mentre vengono usati, impedendo ad altri utenti e ad altri comandi, script e funzioni, di modificarli.

Tuttavia, il blocco è una funzionalità del database. Non è correlato alle transazioni. Se si lavora in un file system abilitato per le transazioni o in un altro archivio dati, è possibile modificare i dati mentre la transazione è in corso.

Esempi

Gli esempi in questa sezione usano il provider del Registro di sistema di PowerShell e presuppongono che si abbia familiarità con esso. Per informazioni sul provider del Registro di sistema, digitare "get-help registry".

ESEMPIO 1: COMMIT DI UNA TRANSAZIONE

Per creare una transazione, usare il cmdlet Start-Transaction. Il comando seguente avvia una transazione con le impostazioni predefinite.

start-transaction

Per includere i comandi nella transazione, usare il parametro UseTransaction del cmdlet . Per impostazione predefinita, i comandi non sono inclusi nella transazione,

Ad esempio, il comando seguente, che imposta il percorso corrente nella chiave Software dell'unità HKCU: non è incluso nella transazione.

cd hkcu:\Software

Il comando seguente, che crea la chiave MyCompany, usa il parametro UseTransaction del cmdlet New-Item per includere il comando nella transazione attiva.

new-item MyCompany -UseTransaction

Il comando restituisce un oggetto che rappresenta la nuova chiave, ma poiché il comando fa parte della transazione, il Registro di sistema non viene ancora modificato.

Hive: HKEY_CURRENT_USER\Software

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

Per eseguire il commit della transazione, usare il cmdlet Complete-Transaction. Poiché influisce sempre sulla transazione attiva, non è possibile specificare la transazione.

complete-transaction

Di conseguenza, la chiave MyCompany viene aggiunta al Registro di sistema.

dir m*
Hive: HKEY_CURRENT_USER\software

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

ESEMPIO 2: ROLLBACK DI UNA TRANSAZIONE

Per creare una transazione, usare il cmdlet Start-Transaction. Il comando seguente avvia una transazione con le impostazioni predefinite.

start-transaction

Il comando seguente, che crea la chiave MyOtherCompany, usa il parametro UseTransaction del cmdlet New-Item per includere il comando nella transazione attiva.

new-item MyOtherCompany -UseTransaction

Il comando restituisce un oggetto che rappresenta la nuova chiave, ma poiché il comando fa parte della transazione, il Registro di sistema non viene ancora modificato.

Hive: HKEY_CURRENT_USER\Software

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

Per eseguire il rollback della transazione, usare il cmdlet Undo-Transaction. Poiché influisce sempre sulla transazione attiva, non si specifica la transazione.

Undo-transaction

Il risultato è che la chiave MyOtherCompany non viene aggiunta al Registro di sistema.

dir m*
Hive: HKEY_CURRENT_USER\software

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

ESEMPIO 3: ANTEPRIMA DI UNA TRANSAZIONE

In genere, i comandi usati nei dati delle modifiche delle transazioni. Tuttavia, i comandi che ottengono dati sono utili anche in una transazione, perché ottengono i dati all'interno della transazione. In questo modo viene fornita un'anteprima delle modifiche che causano il commit della transazione.

Nell'esempio seguente viene illustrato come usare il comando Get-ChildItem (l'alias è "dir") per visualizzare in anteprima le modifiche in una transazione.

Il comando seguente avvia una transazione.

start-transaction

Il comando seguente usa il cmdlet New-ItemProperty per aggiungere la voce del Registro di sistema MyKey alla chiave MyCompany. Il comando usa il parametro UseTransaction per includere il comando nella transazione.

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

Il comando restituisce un oggetto che rappresenta la nuova voce del Registro di sistema, ma la voce del Registro di sistema non viene modificata.

MyKey
-----
123

Per ottenere gli elementi attualmente presenti nel Registro di sistema, usare un comando Get-ChildItem ("dir") senza il parametro UseTransaction. Il comando seguente ottiene gli elementi che iniziano con "M".

dir m*

Il risultato indica che non sono ancora state aggiunte voci alla chiave MyCompany.

Hive: HKEY_CURRENT_USER\Software

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

Per visualizzare in anteprima l'effetto del commit della transazione, immettere un comando Get-ChildItem ("dir") con il parametro UseTransaction. Questo comando ha una visualizzazione dei dati dall'interno della transazione.

dir m* -useTransaction

Il risultato indica che, se viene eseguito il commit della transazione, la voce MyKey verrà aggiunta alla chiave MyCompany.

Hive: HKEY_CURRENT_USER\Software

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

ESEMPIO 4: COMBINAZIONE DI COMANDI TRANSAZIONATI E NON TRANSAZIONI

È possibile immettere comandi non transazionati durante una transazione. I comandi non transazionati influiscono immediatamente sui dati, ma non influiscono sulla transazione. Il comando seguente avvia una transazione nella chiave del Registro di sistema HKCU:\Software.

start-transaction

I tre comandi successivi usano il cmdlet New-Item per aggiungere chiavi al Registro di sistema. Il primo e il terzo comando usano il parametro UseTransaction per includere i comandi nella transazione. Il secondo comando omette il parametro . Poiché il secondo comando non è incluso nella transazione, viene eseguito immediatamente.

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

Per visualizzare lo stato corrente del Registro di sistema, usare un comando Get-ChildItem ("dir") senza il parametro UseTransaction. Questo comando ottiene gli elementi che iniziano con "M".

dir m*

Il risultato mostra che la chiave MyCompany2 viene aggiunta al Registro di sistema, ma le chiavi MyCompany1 e MyCompany3, che fanno parte della transazione, non vengono aggiunte.

Hive: HKEY_CURRENT_USER\Software

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

Il comando seguente esegue il commit della transazione.

complete-transaction

Ora, le chiavi aggiunte come parte della transazione vengono visualizzate nel Registro di sistema.

dir m*
Hive: HKEY_CURRENT_USER\Software

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

ESEMPIO 5: USO DEL ROLLBACK AUTOMATICO

Quando un comando in una transazione genera un errore di qualsiasi tipo, viene eseguito automaticamente il rollback della transazione.

Questo comportamento predefinito è progettato per gli script che eseguono transazioni. Gli script sono in genere ben testati e includono la logica di gestione degli errori, quindi gli errori non sono previsti e devono terminare la transazione.

Il primo comando avvia una transazione nella chiave del Registro di sistema HKCU:\Software.

start-transaction

Il comando seguente usa il cmdlet New-Item per aggiungere la chiave MyCompany al Registro di sistema. Il comando usa il parametro UseTransaction (l'alias è "usetx") per includere il comando nella transazione.

New-Item MyCompany -UseTX

Poiché la chiave MyCompany esiste già nel Registro di sistema, il comando ha esito negativo e viene eseguito il rollback della transazione.

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

Un comando Get-Transaction conferma che è stato eseguito il rollback della transazione e che SubscriberCount è 0.

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

ESEMPIO 6: MODIFICA DELLA PREFERENZA DI ROLLBACK

Se si desidera che la transazione sia più a tolleranza di errore, è possibile usare il parametro RollbackPreference di Start-Transaction per modificare la preferenza.

Il comando seguente avvia una transazione con una preferenza di rollback "Never".

start-transaction -rollbackpreference Never

In questo caso, quando il comando ha esito negativo, la transazione non viene eseguito automaticamente il rollback.

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

Poiché la transazione è ancora attiva, è possibile inviare nuovamente il comando come parte della transazione.

New-Item MyOtherCompany -UseTX

ESEMPIO 7: USO DEL CMDLET U edizione Standard-TRANSACTION

Il cmdlet Use-Transaction consente di eseguire lo scripting diretto sugli oggetti di Microsoft .NET Framework abilitati per le transazioni. Use-Transaction accetta un blocco di script che può contenere solo comandi ed espressioni che usano oggetti .NET Framework abilitati per le transazioni, ad esempio istanze della classe Microsoft.PowerShell.Commands.Management.TransactedString.

Il comando seguente avvia una transazione.

start-transaction

Il comando New-Object seguente crea un'istanza della classe TransactedString e la salva nella variabile $t.

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

Il comando seguente usa il metodo Append dell'oggetto TransactedString per aggiungere testo alla stringa. Poiché il comando non fa parte della transazione, la modifica viene applicata immediatamente.

$t.append("Windows")

Il comando seguente usa lo stesso metodo Append per aggiungere testo, ma aggiunge il testo come parte della transazione. Il comando è racchiuso tra parentesi graffe e viene impostato come valore del parametro ScriptBlock di Use-Transaction. Il parametro UseTransaction (UseTx) è obbligatorio.

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

Per visualizzare il contenuto corrente della stringa transazionata in $t, utilizzare il metodo ToString dell'oggetto TransactedString.

$t.tostring()

L'output mostra che solo le modifiche non transazionate sono effettive.

Windows

Per visualizzare il contenuto corrente della stringa transazionale in $t dall'interno della transazione, incorporare l'espressione in un comando Use-Transaction.

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

L'output mostra la visualizzazione delle transazioni.

PowerShell

Il comando seguente esegue il commit della transazione.

complete-transaction

Per visualizzare la stringa finale:

$t.tostring()
PowerShell

ESEMPIO 8: GESTIONE DELLE TRANSAZIONI MULTI-SOTTOSCRITTORE

Quando si avvia una transazione mentre è in corso un'altra transazione, PowerShell non crea una seconda transazione per impostazione predefinita. Aggiunge invece un sottoscrittore alla transazione corrente.

In questo esempio viene illustrato come visualizzare e gestire una transazione multi-sottoscrittore.

Iniziare avviando una transazione nella chiave HKCU:\Software.

start-transaction

Il comando seguente usa il comando Get-Transaction per ottenere la transazione attiva.

get-transaction

Il risultato mostra l'oggetto che rappresenta la transazione attiva.

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

Il comando seguente aggiunge la chiave MyCompany al Registro di sistema. Il comando usa il parametro UseTransaction per includere il comando nella transazione.

new-item MyCompany -UseTransaction

Il comando seguente usa il comando Start-Transaction per avviare una transazione. Anche se questo comando viene digitato al prompt dei comandi, è più probabile che questo scenario si verifichi quando si esegue uno script che contiene una transazione.

start-transaction

Un comando Get-Transaction indica che il numero di sottoscrittori per l'oggetto transazione viene incrementato. Il valore è ora 2.

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

Il comando successivo usa il cmdlet New-ItemProperty per aggiungere la voce del Registro di sistema MyKey alla chiave MyCompany. Usa il parametro UseTransaction per includere il comando nella transazione.

new-itemproperty -path MyCompany -name MyKey -UseTransaction

La chiave MyCompany non esiste nel Registro di sistema, ma questo comando ha esito positivo perché i due comandi fanno parte della stessa transazione.

Il comando seguente esegue il commit della transazione. Se è stato eseguito il rollback della transazione, verrà eseguito il rollback della transazione per tutti i sottoscrittori.

complete-transaction

Un comando Get-Transaction mostra che il conteggio del sottoscrittore per l'oggetto transazione è 1, ma il valore di Status è ancora Attivo (non Commit).

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

Per completare il commit della transazione, immettere un secondo comando Complete- Transaction. Per eseguire il commit di una transazione multi-sottoscrittore, è necessario immettere un comando Complete-Transaction per ogni comando Start-Transaction.

complete-transaction

Un altro comando Get-Transaction mostra che è stato eseguito il commit della transazione.

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

ESEMPIO 9: GESTIONE DI TRANSAZIONI INDIPENDENTI

Quando si avvia una transazione mentre è in corso un'altra transazione, è possibile utilizzare il parametro Independent di Start-Transaction per rendere la nuova transazione indipendente dalla transazione originale.

Quando si esegue questa operazione, Start-Transaction crea un nuovo oggetto transazione e crea la nuova transazione attiva.

Iniziare avviando una transazione nella chiave HKCU:\Software.

start-transaction

Il comando seguente usa il comando Get-Transaction per ottenere la transazione attiva.

get-transaction

Il risultato mostra l'oggetto che rappresenta la transazione attiva.

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

Il comando seguente aggiunge la chiave del Registro di sistema MyCompany come parte della transazione. Usa il parametro UseTransaction (UseTx) per includere il comando nella transazione attiva.

new-item MyCompany -use

Il comando seguente avvia una nuova transazione. Il comando usa il parametro Independent per indicare che questa transazione non è un sottoscrittore della transazione attiva.

start-transaction -independent

Quando si crea una transazione indipendente, la nuova transazione creata più di recente diventa la transazione attiva. È possibile usare un comando Get-Transaction per ottenere la transazione attiva.

get-transaction

Si noti che il Valore SubscriberCount della transazione è 1, a indicare che non sono presenti altri sottoscrittori e che la transazione è nuova.

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

Prima di poter gestire la transazione originale, è necessario completare la nuova transazione (commit o rollback).

Il comando seguente aggiunge la chiave MyOtherCompany al Registro di sistema. Usa il parametro UseTransaction (UseTx) per includere il comando nella transazione attiva.

new-item MyOtherCompany -usetx

Eseguire ora il rollback della transazione. Se fosse presente una singola transazione con due sottoscrittori, il rollback della transazione eseguirà il rollback dell'intera transazione per tutti i sottoscrittori.

Tuttavia, poiché queste transazioni sono indipendenti, il rollback della transazione più recente annulla le modifiche del Registro di sistema e apporta alla transazione attiva la transazione originale.

undo-transaction

Un comando Get-Transaction conferma che la transazione originale è ancora attiva nella sessione.

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

Il comando seguente esegue il commit della transazione attiva.

complete-transaction

Un comando Get-ChildItem mostra che il Registro di sistema è stato modificato.

dir m*
Hive: HKEY_CURRENT_USER\Software

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

Vedi anche