Start-Transaction
Avvia una transazione.
Sintassi
Start-Transaction
[-Timeout <Int32>]
[-Independent]
[-RollbackPreference <RollbackSeverity>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Descrizione
Il cmdlet Start-Transaction
avvia una transazione, ovvero una serie di comandi gestiti come unità. È possibile completare o eseguire il commit di una transazione. In alternativa, può essere completamente annullata o eseguito il rollback, in modo che tutti i dati modificati dalla transazione vengano ripristinati nello stato originale.
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.
Per impostazione predefinita, se un comando nella transazione genera un errore, viene eseguito automaticamente il rollback delle transazioni. È possibile usare il parametro RollbackPreference per modificare questo comportamento.
I cmdlet usati in una transazione devono essere progettati per supportare le transazioni. I cmdlet che supportano le transazioni hanno un parametro UseTransaction. Per eseguire transazioni in un provider, il provider deve supportare le transazioni. Il provider del Registro di sistema di Windows PowerShell in Windows Vista e versioni successive del sistema operativo Windows supporta le transazioni. È anche possibile usare la classe Microsoft.PowerShell.Commands.Management.TransactedString per includere espressioni nelle transazioni in qualsiasi versione del sistema Windows che supporta Windows PowerShell. Altri provider di Windows PowerShell possono supportare anche le transazioni.
Una sola transazione può essere attiva alla volta. Se si avvia una nuova transazione indipendente mentre è in corso una transazione, la nuova transazione diventa la transazione attiva ed è necessario eseguire il commit o il rollback della nuova transazione prima di apportare modifiche alla transazione originale.
Start-Transaction
cmdlet è un set di cmdlet che supportano la funzionalità transazioni in Windows PowerShell. Per altre informazioni, vedere about_Transactions.
Esempio
Esempio 1: Avviare ed eseguire il rollback di una transazione
Set-Location hkcu:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
New-ItemProperty "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
Undo-Transaction
Questi comandi avviano e quindi esegue il rollback di una transazione. Poiché viene eseguito il rollback della transazione, non vengono apportate modifiche al Registro di sistema.
Esempio 2: Avviare e completare una transazione
Set-Location hkcu:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
New-ItemProperty "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
Complete-Transaction
Questi comandi iniziano e quindi completano una transazione. Non vengono apportate modifiche al Registro di sistema finché non viene usato il comando Complete-Transaction
.
Esempio 3: Usare preferenze di rollback diverse
Set-Location HKCU:\software
Start-Transaction
New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction
New-Item -Path . -Name "ContosoCompany" -UseTransaction
Start-Transaction -RollbackPreference never
New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction
New-Item -Path . -Name "ContosoCompany" -UseTransaction
# Start-Transaction (-rollbackpreference error)
Start-Transaction
New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction
New-Item : The registry key at the specified path does not exist.
At line:1 char:9
+ new-item <<<< -Path NoPath -Name ContosoCompany -UseTransaction
New-Item -Path . -Name "Contoso" -UseTransaction
New-Item : Cannot use transaction. The transaction has been rolled back or has timed out.
At line:1 char:9
+ New-Item <<<< -Path . -Name ContosoCompany -UseTransaction
# Start-Transaction (-rollbackpreference never)
Start-Transaction -RollbackPreference never
New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction
New-Item : The registry key at the specified path does not exist.
At line:1 char:9
+ New-Item <<<< -Path NoPath -Name "ContosoCompany" -UseTransaction
New-Item -Path . -Name "ContosoCompany" -UseTransaction
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
0 0 ContosoCompany {}
Complete-Transaction
# Succeeds
In questo esempio viene illustrato l'effetto della modifica del valore del parametro RollbackPreference.
Nel primo set di comandi, Start-Transaction
non usa RollbackPreference. Di conseguenza, viene usato il valore predefinito (Errore). Quando si verifica un errore in un comando di transazione, ovvero il percorso specificato non esiste, viene eseguito automaticamente il rollback della transazione.
Nel secondo set di comandi, Start-Transaction
usa RollbackPreference con il valore Never. Di conseguenza, quando si verifica un errore in un comando di transazione, la transazione è ancora attiva e può essere completata correttamente.
Poiché la maggior parte delle transazioni deve essere eseguita senza errori, il valore predefinito di RollbackPreference è in genere preferibile.
Esempio 4: Usare questo cmdlet mentre è in corso una transazione
Set-Location HKCU:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
Start-Transaction
Get-Transaction
New-Item "ContosoCompany2" -UseTransaction
Complete-Transaction
Complete-Transaction
Get-Transaction
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 2 Active
In questo esempio viene illustrato l'effetto dell'uso di Start-Transaction
mentre è in corso una transazione.
L'effetto è molto simile al join della transazione in corso.
Anche se si tratta di un comando semplificato, questo scenario si verifica spesso quando la transazione comporta l'esecuzione di uno script che include una transazione completa.
Il primo comando Start-Transaction
avvia la transazione. Il primo comando New-Item
fa parte della transazione.
Il secondo comando Start-Transaction
aggiunge un nuovo sottoscrittore alla transazione. Il comando Get-Transaction
restituisce ora una transazione con un numero di sottoscrittori pari a 2. Il secondo comando New-Item
fa parte della stessa transazione.
Non vengono apportate modifiche al Registro di sistema fino al completamento dell'intera transazione. Per completare la transazione, è necessario immettere due comandi Complete-Transaction
, uno per ogni sottoscrittore. Se si esegue il rollback della transazione in qualsiasi momento, verrà eseguito il rollback di tutte le transazioni per entrambi i sottoscrittori.
Esempio 5: Avviare una transazione indipendente mentre è in corso
Set-Location HKCU:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
Start-Transaction -Independent
Get-Transaction
Undo-Transaction
New-ItemProperty -Path "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
Complete-Transaction
Get-ChildItem contoso*
Get-Transaction
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
Undo-Transaction
New-ItemProperty -Path "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
MyKey
-----
123
Complete-Transaction
Get-ChildItem contoso*
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
0 1 MyCompany {MyKey}
In questo esempio viene illustrato l'effetto dell'uso del parametro independent di Start-Transaction
per avviare una transazione mentre è in corso un'altra transazione.
In questo caso, viene eseguito il rollback della nuova transazione senza influire sulla transazione originale.
Anche se le transazioni sono logicamente indipendenti, poiché è possibile attivare una sola transazione alla volta, è necessario eseguire il rollback o eseguire il commit della transazione più recente prima di riprendere il lavoro sulla transazione originale.
Il primo set di comandi avvia una transazione.
Il comando New-Item
fa parte della prima transazione.
Nel secondo set di comandi il comando Start-Transaction
usa il parametro independent.
Il comando Get-Transaction
che segue mostra l'oggetto transazione per la transazione attiva, ovvero quello più recente.
Il numero di sottoscrittori è uguale a 1, che indica che le transazioni non sono correlate.
Quando viene eseguito il rollback della transazione attiva usando un comando Undo-Transaction
, la transazione originale diventa nuovamente attiva.
Il comando New-ItemProperty
, che fa parte della transazione originale, termina senza errori e la transazione originale può essere completata usando il comando Complete-Transaction
.
Di conseguenza, il Registro di sistema viene modificato.
Esempio 6: Eseguire comandi che non fanno parte di una transazione
Set-Location hkcu:\software
Start-Transaction
New-Item "ContosoCompany1" -UseTransaction
New-Item "ContosoCompany2"
New-Item "ContosoCompany3" -UseTransaction
Get-ChildItem contoso*
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
0 0 ContosoCompany2 {}
Complete-Transaction
Get-ChildItem contoso*
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
0 0 ContosoCompany1 {}
0 0 ContosoCompany2 {}
0 0 ContosoCompany3 {}
In questo esempio viene illustrato che i comandi inviati mentre è in corso una transazione possono essere inclusi nella transazione o non inclusi. Solo i comandi che usano il parametro UseTransaction fanno parte della transazione.
Il primo e il terzo comando di New-Item
usano il parametro UseTransaction. Questi comandi fanno parte della transazione. Poiché il secondo comando New-Item
non usa il parametro UseTransaction, non fa parte della transazione.
Il primo comando Get-ChildItem mostra l'effetto. Il secondo comando New-Item
viene completato immediatamente, ma il primo e il terzo New-Item
comandi non sono validi finché non viene eseguito il commit della transazione.
Il comando Complete-Transaction
esegue il commit della transazione. Di conseguenza, il secondo comando Get-ChildItem mostra che tutti i nuovi elementi vengono aggiunti al Registro di sistema.
Esempio 7: Eseguire il rollback di una transazione che non termina in un intervallo di tempo specificato
Start-Transaction -Timeout 2
# Wait two minutes...
Get-Transaction
New-Item HKCU:\Software\ContosoCompany -UseTransaction
Start-Transaction -Timeout 2
# Wait two minutes...
Get-Transaction
RollbackPreference SubscriberCount Status
------------------ --------------- -----------
Error 1 RolledBack
New-Item HKCU:\Software\ContosoCompany -UseTransaction
New-Item : Cannot use transaction. The transaction has been rolled back or has timed out.
At line:1 char:9
+ new-item <<<< MyCompany -UseTransaction
Questo comando usa il parametro Timeout di Start-Transaction
per avviare una transazione che deve essere completata entro due minuti. Se la transazione non viene completata alla scadenza del timeout, viene eseguito automaticamente il rollback.
Quando scade il timeout, non si riceve una notifica, ma la proprietà Status dell'oggetto transazione è impostata su RolledBack e i comandi che usano il parametro UseTransaction hanno esito negativo.
Parametri
-Confirm
Richiede conferma prima di eseguire il cmdlet.
Tipo: | SwitchParameter |
Alias: | cf |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-Independent
Indica che questo cmdlet avvia una transazione indipendente da qualsiasi transazione in corso.
Per impostazione predefinita, se si utilizza Start-Transaction
mentre è in corso un'altra transazione, viene aggiunto un nuovo sottoscrittore alla transazione in corso. Questo parametro ha effetto solo quando una transazione è già in corso nella sessione.
Per impostazione predefinita, se si utilizza Start-Transaction
mentre è in corso una transazione, l'oggetto transazione esistente viene riutilizzato e il conteggio dei sottoscrittori viene incrementato. L'effetto è molto simile al join della transazione originale. Un comando Undo-Transaction
esegue il rollback dell'intera transazione.
Per completare la transazione, è necessario immettere un comando Complete-Transaction
per ogni sottoscrittore.
Poiché la maggior parte delle transazioni in corso contemporaneamente è correlata, l'impostazione predefinita è sufficiente per la maggior parte degli utilizzi.
Se si specifica il parametro Independent, questo cmdlet crea una nuova transazione che può essere completata o annullata senza influire sulla transazione originale. Tuttavia, poiché una sola transazione può essere attiva alla volta, è necessario completare o eseguire il rollback della nuova transazione prima di riprendere il lavoro sulla transazione originale.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-RollbackPreference
Specifica le condizioni in cui viene eseguito automaticamente il rollback di una transazione. I valori accettabili per questo parametro sono:
-
Error
Il rollback della transazione viene eseguito automaticamente se si verifica un errore irreversibile o non irreversibile. -
TerminatingError
Il rollback della transazione viene eseguito automaticamente se si verifica un errore irreversibile. -
Never
Il rollback della transazione non viene mai eseguito automaticamente.
Il valore predefinito è Error
.
Tipo: | RollbackSeverity |
Valori accettati: | Error, TerminatingError, Never |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-Timeout
Specifica il tempo massimo, espresso in minuti, in cui la transazione è attiva. Quando scade il timeout, viene eseguito automaticamente il rollback della transazione.
Per impostazione predefinita, non è previsto alcun timeout per le transazioni avviate dalla riga di comando. Quando le transazioni vengono avviate da uno script, il timeout predefinito è di 30 minuti.
Tipo: | Int32 |
Alias: | TimeoutMins |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-WhatIf
Mostra cosa accadrebbe se il cmdlet viene eseguito. Il cmdlet non viene eseguito.
Tipo: | SwitchParameter |
Alias: | wi |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
Input
None
Non è possibile inviare tramite pipe l'input a questo cmdlet.
Output
None
Questo cmdlet non genera alcun output.