Condividi tramite


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.