Compartir a través de


Start-Transaction

Inicia una transacción.

Sintaxis

Start-Transaction
     [-Timeout <Int32>]
     [-Independent]
     [-RollbackPreference <RollbackSeverity>]
     [-WhatIf]
     [-Confirm]
     [<CommonParameters>]

Description

El Start-Transaction cmdlet inicia una transacción, que es una serie de comandos que se administran como una unidad. Se puede completar una transacción o confirmarse. Como alternativa, puede deshacerse por completo o revertirse, de modo que los datos modificados por la transacción se restauren a su estado original. Como los comandos en una transacción se administran como una unidad, se confirman o se revierten todos los comandos.

De forma predeterminada, si algún comando de la transacción genera un error, las transacciones se revierten automáticamente. Puede usar el parámetro RollbackPreference para cambiar este comportamiento.

Los cmdlets usados en una transacción se deben diseñar para que admitan transacciones. Los cmdlets que admiten transacciones tienen un parámetro UseTransaction . Para realizar las transacciones de un proveedor, el proveedor debe admitir transacciones. El proveedor del Registro de Windows PowerShell en Windows Vista y versiones posteriores del sistema operativo Windows admite transacciones. También puede usar la clase Microsoft.PowerShell.Commands.Management.TransactedString para incluir expresiones en transacciones en cualquier versión del sistema Windows que admita Windows PowerShell. Otros proveedores de Windows PowerShell también pueden admitir transacciones.

Solo puede haber activa una transacción a la vez. Si inicia una transacción nueva e independiente mientras una transacción está en curso, la nueva transacción se convierte en la transacción activa y debe confirmar o revertir la nueva transacción antes de realizar cambios en la transacción original.

Start-Transaction cmdlet es uno de un conjunto de cmdlets que admiten la característica de transacciones en Windows PowerShell. Para obtener más información, consulte about_Transactions.

Ejemplos

Ejemplo 1: Iniciar y revertir una transacción

Set-Location hkcu:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
New-ItemProperty "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
Undo-Transaction

Estos comandos inician y después revierten una transacción. Dado que la transacción se revierte, no se realizan cambios en el Registro.

Ejemplo 2: Iniciar y completar una transacción

Set-Location hkcu:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
New-ItemProperty "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
Complete-Transaction

Estos comandos inician y después completan una transacción. No se realizan cambios en el Registro hasta que se use el Complete-Transaction comando .

Ejemplo 3: Usar diferentes preferencias de reversión

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

En este ejemplo se muestra el efecto de cambiar el valor del parámetro RollbackPreference .

En el primer conjunto de comandos, Start-Transaction no usa RollbackPreference. Como resultado, se usa el valor predeterminado (Error). Cuando se produce un error en un comando de transacción, es decir, la ruta de acceso especificada no existe, la transacción se revierte automáticamente.

En el segundo conjunto de comandos, Start-Transaction usa RollbackPreference con un valor de Never. Como resultado, cuando se produce un error en un comando de transacción, la transacción todavía está activa y se puede completar correctamente.

Dado que la mayoría de las transacciones deben realizarse sin errores, normalmente se prefiere el valor predeterminado de RollbackPreference .

Ejemplo 4: Uso de este cmdlet mientras una transacción está en curso

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

En este ejemplo se muestra el efecto de usar Start-Transaction mientras una transacción está en curso. El efecto es muy similar al de unirse a la transacción en curso.

Aunque se trata de un comando simplificado, este escenario se produce con frecuencia cuando la transacción implica ejecutar un script que incluye una transacción completa.

El primer Start-Transaction comando inicia la transacción. El primer New-Item comando forma parte de la transacción.

El segundo Start-Transaction comando agrega un nuevo suscriptor a la transacción. El Get-Transaction comando ahora devuelve una transacción con un recuento de suscriptores de 2. El segundo New-Item comando forma parte de la misma transacción.

No se realizan cambios en el Registro hasta que se complete toda la transacción. Para completar la transacción, debe escribir dos Complete-Transaction comandos, uno para cada suscriptor. Si fuera a revertir la transacción en cualquier momento, toda la transacción se revertiría para ambos suscriptores.

Ejemplo 5: Iniciar una transacción independiente mientras una está en curso

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}

En este ejemplo se muestra el efecto de usar el parámetro Independent de Start-Transaction para iniciar una transacción mientras otra transacción está en curso. En este caso, la nueva transacción se revierte sin afectar a la transacción original.

Aunque las transacciones son lógicamente independientes, porque solo puede haber una transacción activa a la vez, debe revertir o confirmar la transacción más reciente antes de reanudar el trabajo en la transacción original.

El primer conjunto de comandos inicia una transacción. El New-Item comando forma parte de la primera transacción.

En el segundo conjunto de comandos, el Start-Transaction comando usa el parámetro Independent . El Get-Transaction comando siguiente muestra el objeto de transacción para la transacción activa, que es la más reciente. El número de suscriptores es igual a 1, que muestra que las transacciones no están relacionadas.

Cuando la transacción activa se revierte mediante un Undo-Transaction comando , la transacción original vuelve a estar activa.

El New-ItemProperty comando, que forma parte de la transacción original, finaliza sin error y la transacción original se puede completar mediante el Complete-Transaction comando . Como resultado, se cambia el Registro.

Ejemplo 6: Ejecutar comandos que no forman parte de una transacción

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

En este ejemplo se muestra que los comandos que se envían mientras hay una transacción en curso se pueden incluir o no en la transacción. Solo los comandos que usan el parámetro UseTransaction forman parte de la transacción.

Los comandos primero y tercer New-Item usan el parámetro UseTransaction . Estos comandos forman parte de la transacción. Dado que el segundo New-Item comando no usa el parámetro UseTransaction , no forma parte de la transacción.

El primer comando Get-ChildItem muestra el efecto. El segundo New-Item comando se completa inmediatamente, pero los comandos primero y tercero New-Item no son efectivos hasta que se confirme la transacción.

El Complete-Transaction comando confirma la transacción. Como resultado, el segundo comando Get-ChildItem muestra que todos los elementos nuevos se agregan al registro.

Ejemplo 7: Revertir una transacción que no finaliza en un tiempo especificado

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

Este comando usa el parámetro Timeout de Start-Transaction para iniciar una transacción que debe completarse en dos minutos. Si la transacción no finaliza cuando expira el tiempo de espera, se revierte automáticamente.

Cuando expire el tiempo de espera, no se le notificará, pero la propiedad Status del objeto de transacción se establece en RolledBack y los comandos que usan el parámetro UseTransaction producen un error.

Parámetros

-Confirm

Le solicita su confirmación antes de ejecutar el cmdlet.

Tipo:SwitchParameter
Alias:cf
Posición:Named
Valor predeterminado:False
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Independent

Indica que este cmdlet inicia una transacción que es independiente de las transacciones en curso. De forma predeterminada, si usa Start-Transaction mientras otra transacción está en curso, se agrega un nuevo suscriptor a la transacción en curso. Este parámetro tiene efecto solo cuando ya hay una transacción en curso en la sesión.

De forma predeterminada, si usa Start-Transaction mientras una transacción está en curso, se reutiliza el objeto de transacción existente y se incrementa el número de suscriptores. El efecto es muy similar al de unirse a la transacción original. Un Undo-Transaction comando revierte toda la transacción. Para completar la transacción, debe escribir un Complete-Transaction comando para cada suscriptor. Dado que la mayoría de las transacciones que están en curso al mismo tiempo están relacionadas, el valor predeterminado es suficiente para la mayoría de los casos.

Si especifica el parámetro Independent , este cmdlet crea una nueva transacción que se puede completar o deshacer sin afectar a la transacción original. Sin embargo, como solo puede haber una transacción activa a la vez, debe completar o revertir la nueva transacción antes de reanudar el trabajo en la transacción original.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-RollbackPreference

Especifica las condiciones en las que una transacción se revierte automáticamente. Los valores permitidos para este parámetro son los siguientes:

  • Error La transacción se revierte automáticamente si se produce un error de terminación o no terminación.
  • TerminatingError La transacción se revierte automáticamente si se produce un error de terminación.
  • Never La transacción nunca se revierte automáticamente.

El valor predeterminado es Error.

Tipo:RollbackSeverity
Valores aceptados:Error, TerminatingError, Never
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Timeout

Especifica el tiempo máximo, en minutos, que la transacción está activa. Cuando expira el tiempo de espera, la transacción se revierte automáticamente.

De forma predeterminada, no hay ningún tiempo de espera para las transacciones que se inician en la línea de comandos. Cuando las transacciones se inician mediante un script, el tiempo de espera predeterminado es de 30 minutos.

Tipo:Int32
Alias:TimeoutMins
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-WhatIf

Muestra lo que sucedería si se ejecutara el cmdlet. El cmdlet no se ejecuta.

Tipo:SwitchParameter
Alias:wi
Posición:Named
Valor predeterminado:False
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

Entradas

None

No se puede canalizar la entrada a este cmdlet.

Salidas

None

Este cmdlet no genera ningún resultado.