ARGOMENTO about_Transactions DESCRIZIONE BREVE Descrive come gestire le operazioni in transazione in Windows PowerShell. DESCRIZIONE DETTAGLIATA Le transazioni sono supportate in Windows PowerShell a partire da Windows PowerShell 2.0. Questa funzionalità consente di avviare una transazione, indicare quali comandi fanno parte della transazione ed eseguire il commit o il rollback di una transazione. INFORMAZIONI SULLE TRANSAZIONI In Windows PowerShell una transazione è un set di uno o più comandi gestiti come un'unità logica. È possibile completare una transazione (eseguirne il commit), modificando in tal modo i dati interessati dalla transazione. In alternativa, è possibile annullare una transazione (eseguirne il rollback) in modo da non modificare i dati interessati. Poiché i comandi in una transazione vengono gestiti come un'unità, viene eseguito il commit o il rollback di tutti i comandi. Le transazioni sono ampiamente utilizzate nell'elaborazione dei dati, in particolare nelle operazioni di database e nelle transazioni finanziarie. Le transazioni vengono utilizzate più spesso quando lo scenario peggiore per un set di comandi non è l'esito negativo di tutti i comandi, ma piuttosto l'esito positivo di alcuni comandi e l'errore di altri, situazione che provoca uno stato del sistema danneggiato, falso o non interpretabile, difficile da ripristinare. CMDLET DI TRANSAZIONE In Windows PowerShell sono inclusi diversi cmdlet progettati per la gestione delle transazioni. Cmdlet Descrizione -------------- --------------------------------- Start-Transaction Avvia una nuova transazione. Use-Transaction Aggiunge un comando o un'espressione alla transazione. Nel comando è necessario utilizzare oggetti abilitati per la transazione. Undo-Transaction 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 vengono modificati. Get-Transaction Ottiene informazioni sulla transazione attiva. Per un elenco di cmdlet di transazione, digitare: get-command *transaction Per informazioni dettagliate sui cmdlet, digitare: get-help <nome-cmdlet> -detailed Ad esempio: get-help use-transaction -detailed ELEMENTI ABILITATI PER LE TRANSAZIONI Per partecipare a una transazione, sia il cmdlet sia il provider devono supportare le transazioni. Questa funzionalità è incorporata negli oggetti interessati dalla transazione. Il provider Registry di Windows PowerShell supporta le transazioni in Windows Vista. L'oggetto TransactedString (Microsoft.PowerShell.Commands.Management.TransactedString) funziona con qualsiasi sistema operativo che esegue Windows PowerShell. Altri provider di Windows PowerShell supportano le transazioni. Per trovare i provider di Windows PowerShell della sessione che supportano le transazioni, utilizzare il comando seguente per trovare il valore "Transactions" nella proprietà Capabilities dei provider: get-psprovider | where {$_.Capabilities -like "*transactions*"} Per ulteriori informazioni su un provider, vedere il relativo argomento della Guida. Per accedere agli argomenti della Guida relativi ai provider, digitare: get-help <nome-provider> Ad esempio, per ottenere l'argomento della Guida relativo al provider Registry, digitare: get-help registry PARAMETRO USETRANSACTION I cmdlet che possono supportare le transazioni dispongono di un parametro UseTransaction. Questo parametro include il comando nella transazione attiva. È possibile utilizzare 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 ha esito negativo. Per trovare i cmdlet con il parametro UseTransaction, digitare: get-help * -parameter UseTransaction In Windows PowerShell, tutti i cmdlet di sistema progettati per utilizzare i provider di Windows PowerShell supportano le transazioni. Di conseguenza, è possibile utilizzare i cmdlet del provider per gestire le transazioni. Per ulteriori informazioni sui provider di Windows PowerShell, vedere about_Providers. OGGETTO TRANSAZIONE Le transazioni sono rappresentate in Windows PowerShell da un oggetto transazione, System.Management.Automation.Transaction. L'oggetto ha le seguenti proprietà: RollbackPreference: Contiene il set della preferenza di rollback per la transazione corrente. È possibile impostare la preferenza di rollback quando si utilizza Start-Transaction per avviare la transazione. La preferenza di rollback determina le condizioni in base alle quali viene eseguito automaticamente il rollback della transazione. I valori validi sono Error, TerminatingError e Never. Il valore predefinito è Error. Status: 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 ne è in corso un'altra. Il conteggio dei sottoscrittori viene diminuito quando un sottoscrittore esegue il commit della transazione. TRANSAZIONI ATTIVE In Windows PowerShell vi è una sola transazione attiva alla volta ed è possibile gestire solo la transazione attiva. Più transazioni possono essere in corso contemporaneamente nella stessa sessione, ma solo la transazione avviata più recentemente è attiva. Di conseguenza, non è possibile specificare una determinata transazione quando si utilizzano i cmdlet di transazione. I comandi si applicano sempre alla transazione attiva. Questa condizione è particolarmente evidente nel comportamento del cmdlet Get-Transaction. Quando si immette un comando Get-Transaction, Get-Transaction ottiene sempre un solo oggetto transazione. Questo oggetto rappresenta la transazione attiva. Per gestire un'altra transazione, è necessario innanzitutto finire la transazione attiva, eseguendone il commit o il rollback. Quando si esegue questa operazione, la transazione precedente diventa automaticamente attiva. Le transazioni diventano attive nell'ordine inverso rispetto a quello di avvio, in modo che la transazione avviata più recentemente sia sempre attiva. SOTTOSCRITTORI E TRANSAZIONI INDIPENDENTI Se si avvia una transazione mentre ne è in corso un'altra, per impostazione predefinita in Windows PowerShell non viene avviata una nuova transazione. Viene invece aggiunto un sottoscrittore alla transazione corrente. Quando una transazione ha più sottoscrittori, un singolo comando Undo-Transaction in qualsiasi momento esegue il rollback dell'intera transazione per tutti i sottoscrittori. Per eseguire il commit della transazione, tuttavia, è necessario immettere un comando Complete-Transaction per ogni sottoscrittore. Per trovare il numero di sottoscrittori di una transazione, verificare la proprietà SubscriberCount dell'oggetto transazione. Ad esempio, nel comando seguente viene utilizzato 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 ne è in corso un'altra è correlata alla transazione originale. Nel modello tipico, uno script che contiene una transazione chiama uno script di supporto che contiene la propria transazione. Poiché le transazioni sono correlate, è necessario eseguirne il rollback o il commit come unità. Tuttavia, è possibile avviare una transazione indipendente dalla transazione corrente tramite 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 attiva. Il commit o il rollback della transazione indipendente può essere eseguito senza effetti sulla transazione originale. Al termine della transazione indipendente (commit o rollback), la transazione originale diventa nuovamente attiva. MODIFICA DI DATI Quando si utilizzano le transazioni per modificare i dati, i dati interessati dalla transazione non vengono modificati finché non viene eseguito il commit della transazione. Tuttavia, gli stessi dati possono essere modificati da comandi che non fanno parte della transazione. Tenere presente questo punto quando si utilizzano le transazioni per gestire dati condivisi. In genere, nei database sono presenti meccanismi che bloccano i dati durante l'utilizzo, allo scopo di impedirne la modifica da parte di altri utenti e di altri comandi, script e funzioni. Tuttavia, il blocco è una funzionalità del database. Non è correlato alle transazioni. Se si utilizza un file system o un altro archivio dati abilitato per le transazioni, è possibile modificare i dati mentre la transazione è in corso. ESEMPI Negli esempi di questa sezione viene utilizzato il provider Registry di Windows PowerShell con cui si presuppone che l'utente abbia familiarità. Per informazioni sul provider Registry, digitare "get-help registry". ESEMPIO 1: ESECUZIONE DEL COMMIT DI UNA TRANSAZIONE Per creare una transazione, utilizzare il cmdlet Start-Transaction. Con il comando seguente viene avviata una transazione con le impostazioni predefinite. start-transaction Per includere comandi nella transazione, utilizzare il parametro UseTransaction del cmdlet. Per impostazione predefinita, i comandi non sono inclusi. Ad esempio, il comando seguente, mediante cui viene impostato il percorso corrente nella chiave Software dell'unità HKCU:, non è incluso nella transazione. cd hkcu:\Software Nel comando seguente, mediante cui viene creata la chiave MyCompany, viene utilizzato 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 il Registro di sistema non viene ancora modificato poiché il comando fa parte della transazione. Hive: HKEY_CURRENT_USER\Software SKC VC Name Property --- -- ---- -------- 0 0 MyCompany {} Per eseguire il commit della transazione, utilizzare 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, utilizzare il cmdlet Start-Transaction . Con il comando seguente viene avviata una transazione con le impostazioni predefinite. start-transaction Nel comando seguente, mediante cui viene creata la chiave MyOtherCompany, viene utilizzato 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 il Registro di sistema non viene ancora modificato poiché il comando fa parte della transazione. Hive: HKEY_CURRENT_USER\Software SKC VC Name Property --- -- ---- -------- 0 0 MyOtherCompany {} Per eseguire il rollback della transazione, utilizzare il cmdlet Undo- Transaction. Poiché influisce sempre sulla transazione attiva, non viene specificata la transazione. Undo-transaction Di conseguenza, 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 utilizzati in una transazione modificano i dati. Tuttavia, anche i comandi che ottengono dati sono utili in una transazione perché ottengono dati all'interno della transazione. Viene in tal modo fornita un'anteprima delle modifiche che verrebbero causate dal commit della transazione. Nell'esempio seguente viene illustrato come utilizzare il comando Get- ChildItem (l'alias è "dir") per visualizzare in anteprima le modifiche in una transazione. Con il comando seguente viene avviata una transazione. start-transaction Nel comando seguente viene utilizzato il cmdlet New-ItemProperty per aggiungere la voce del Registro di sistema MyKey alla chiave MyCompany. Viene utilizzato 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 è stata modificata. MyKey ----- 123 Per ottenere gli elementi attualmente presenti nel Registro di sistema, utilizzare un comando Get-ChildItem ("dir") senza il parametro UseTransaction. Con il comando seguente si ottengono gli elementi che iniziano con "M". dir m* Il risultato evidenzia che non è stata ancora aggiunta alcuna voce 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 dati dall'interno UseTransaction. Con questo comando si ottiene una dei visualizzazionedella transazione. dir m* -useTransaction Il risultato evidenza che, se viene eseguito il commit della transazione, la voce MyKey viene aggiunta alla chiave MyCompany. Hive: HKEY_CURRENT_USER\Software SKC VC Name Property --- -- ---- -------- 83 1 Microsoft {(default)} 0 0 MyCompany {MyKey} ESEMPIO 4: COMBINAZIONE DI COMANDI IN TRANSAZIONE E NON È possibile immettere comandi non in transazione durante una transazione. Tali comandi hanno un effetto immediato sui dati, ma non sulla transazione. Con il comando seguente viene avviata una transazione nella chiave del Registro di sistema HKCU:\Software. start-transaction Nei tre comandi successivi viene utilizzato il cmdlet New-Item per aggiungere chiavi al Registro di sistema. Nel primo e nel terzo comando viene utilizzato il parametro UseTransaction per includere i comandi nella transazione. Nel secondo comando viene omesso il parametro. Poiché il secondo comando non è incluso nella transazione, risulta immediatamente valido. new-item MyCompany1 -UseTransaction new-item MyCompany2 new-item MyCompany3 -UseTransaction Per visualizzare lo stato corrente del Registro di sistema, utilizzare un comando Get-ChildItem ("dir") senza il parametro UseTransaction. Con questo comando si ottengono gli elementi che iniziano con "M". dir m* Il risultato evidenzia che la chiave MyCompany2 viene aggiunta al Registro di sistema, mentre 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 {} Con il comando seguente viene eseguito il commit della transazione. complete-transaction A questo punto 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: UTILIZZO DEL ROLLBACK AUTOMATICO Quando un comando in una transazione genera un errore di qualsiasi tipo, viene automaticamente eseguito il rollback della transazione. Questo comportamento predefinito è progettato per gli script che eseguono transazioni. Gli script vengono in genere sottoposti a test accurati e includono la logica di gestione degli errori, pertanto gli errori non sono previsti e devono terminare la transazione. Con il primo comando viene avviata una transazione nella chiave del Registro di sistema HKCU:\Software. start-transaction Nel comando seguente viene utilizzato il cmdlet New-Item per aggiungere la chiave MyCompany al Registro di sistema. Viene utilizzato 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, New-Item: Chiave del percorso già esistente Riga:1 Carattere:9 + new-item <<<< MyCompany -usetx Con un comando Get-Transaction viene confermato che il rollback della transazione è stato eseguito e che SubscriberCount è 0. RollbackPreference SubscriberCount Status ------------------ --------------- ------ Error 0 RolledBack ESEMPIO 6: MODIFICA DELLA PREFERENZA DI ROLLBACK Se si desidera una maggiore tolleranza di errore nella transazione, è possibile utilizzare il parametro RollbackPreference di Start-Transaction per modificare la preferenza. Con il comando seguente viene avviata una transazione con preferenza di rollback "Never". start-transaction -rollbackpreference Never In questo caso, quando il comando ha esito negativo, il rollback della transazione non viene eseguito automaticamente. New-Item MyCompany -UseTX New-Item: Chiave del percorso già esistente Riga:1 Carattere: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: UTILIZZO DEL CMDLET USE-TRANSACTION Il cmdlet Use-Transaction consente di eseguire script diretti su oggetti Microsoft .NET Framework abilitati per le transazioni. Use-Transaction accetta un blocco di script che può contenere solo comandi ed espressioni che utilizzano oggetti .NET Framework abilitati per le transazioni, ad esempio istanze della classe Microsoft.PowerShell.Commands.Management.TransactedString. Con il comando seguente viene avviata una transazione. start-transaction Con il comando New-Object seguente viene creata un'istanza della classe TransactedString che viene quindi salvata nella variabile $t. $t = New-Object Microsoft.PowerShell.Commands.Management.Tran sactedString Nel comando seguente viene utilizzato il metodo Append dell'oggetto TransactedString per aggiungere testo alla stringa. Poiché il comando non fa parte della transazione, la modifica diventa immediatamente effettiva. $t.append("Windows") Nel comando seguente viene utilizzato lo stesso metodo Append per aggiungere testo, ma il testo viene aggiunto 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 vedere il contenuto corrente della stringa sottoposta a transazione in $t, utilizzare il metodo ToString dell'oggetto TransactedString. $t.tostring() L'output evidenzia che solo le modifiche non in transazione sono effettive. Windows Per vedere il contenuto corrente della stringa sottoposta a transazione in $t dall'interno della transazione, incorporare l'espressione in un comando Use-Transaction. use-transaction {$s.tostring()} -usetx L'output mostra la visualizzazione della transazione. Windows PowerShell Con il comando seguente viene eseguito il commit della transazione. complete-transaction Per vedere la stringa finale: $t.tostring() Windows PowerShell ESEMPIO 7: GESTIONE DELLE TRANSAZIONI CON PIÙ SOTTOSCRITTORI Quando si avvia una transazione mentre ne è in corso un'altra, per impostazione predefinita in Windows PowerShell non viene creata una seconda transazione. Viene invece aggiunto un sottoscrittore alla transazione corrente. In questo esempio viene illustrato come visualizzare e gestire una transazione con più sottoscrittori. Innanzitutto, avviare una transazione nella chiave HKCU:\Software. start-transaction Nel comando seguente viene utilizzato 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 Con il comando seguente viene aggiunta la chiave MyCompany al Registro di sistema. Viene utilizzato il parametro UseTransaction per includere il comando nella transazione. new-item MyCompany -UseTransaction Nel comando seguente viene utilizzato il comando Start-Transaction per avviare una transazione. Benché questo comando venga digitato al prompt dei comandi, è più probabile che questo scenario si verifichi quando si esegue uno script che contiene una transazione. start-transaction Con un comando Get-Transaction viene mostrato che il conteggio dei sottoscrittori nell'oggetto transazione viene incrementato. Il valore è ora 2. RollbackPreference SubscriberCount Status ------------------ --------------- ------ Error 2 Active Nel comando seguente viene utilizzato il cmdlet New-ItemProperty per aggiungere la voce del Registro di sistema MyKey alla chiave MyCompany. Viene utilizzato 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. Con il comando seguente viene eseguito il commit della transazione. Se venisse eseguito il rollback della transazione, tale operazione verrebbe eseguita per tutti i sottoscrittori. complete-transaction Con un comando Get-Transaction viene mostrato che il conteggio dei è sottoscrittori sull'oggetto transazione è 1, ma il valore di Status ancora Active (non Committed). 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 con più sottoscrittori, è necessario immettere un comando Complete-Transaction per ogni comando Start-Transaction. complete-transaction Con un altro comando Get-Transaction viene mostrato che il commit della transazione è stato eseguito. RollbackPreference SubscriberCount Status ------------------ --------------- ------ Error 0 Committed ESEMPIO 8: GESTIONE DI TRANSAZIONI INDIPENDENTI Quando si avvia una transazione mentre un'altra transazione è in corso, è possibile utilizzare il parametro Independent di Start-Transaction per rendere la nuova transazione indipendente da quella originale. In tal caso, con Start-Transaction viene creato un nuovo oggetto transazione e la nuova transazione diventa attiva. Innanzitutto, avviare una transazione nella chiave HKCU:\Software. start-transaction Nel comando seguente viene utilizzato 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 Con il comando seguente viene aggiunta la chiave del Registro di sistema MyCompany come parte della transazione. Il parametro UseTransaction (UseTx) viene utilizzato per includere il comando nella transazione attiva. new-item MyCompany -use Con il comando seguente viene avviata una nuova transazione. Viene utilizzato 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ù recentemente) diventa attiva. È possibile utilizzare un comando Get-Transaction per ottenere la transazione attiva. get-transaction Si noti che il valore di SubscriberCount della transazione è 1, per 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, ovvero eseguirne il commit o il rollback. Con il comando seguente viene aggiunta la chiave MyOtherCompany al Registro di sistema. Il parametro UseTransaction (UseTx) viene utilizzato per includere il comando nella transazione attiva. new-item MyOtherCompany -usetx A questo punto, eseguire il rollback della transazione. Se fosse presente una sola transazione con due sottoscrittori, il rollback della transazione verrebbe eseguito sull'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 rende attiva la transazione originale. undo-transaction Con un comando Get-Transaction viene confermato che la transazione originale è ancora attiva nella sessione. get-transaction RollbackPreference SubscriberCount Status ------------------ --------------- ------ Error 1 Active Con il comando seguente viene eseguito il commit della transazione. complete-transaction Con un comando Get-ChildItem viene mostrato 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 {} VEDERE ANCHE Start-Transaction Get-Transaction Complete-Transaction Undo-Transaction Use-Transaction Registry (provider) about_Providers Get-PSProvider Get-ChildItem