about_Transactions

Descripción breve

Describe cómo administrar las operaciones de transacción en PowerShell.

Descripción larga

Las transacciones se admiten en PowerShell a partir de PowerShell 2.0. Esta característica permite iniciar una transacción, indicar qué comandos forman parte de la transacción y confirmar o revertir una transacción.

ACERCA DE LAS TRANSACCIONES

En PowerShell, una transacción es un conjunto de uno o varios comandos que se administran como una unidad lógica. Se puede completar una transacción ("confirmada"), que cambia los datos afectados por la transacción. O bien, una transacción se puede deshacer completamente ("revertir") para que la transacción no cambie los datos afectados.

Dado que los comandos de una transacción se administran como una unidad, todos los comandos se confirman o todos los comandos se revierten.

Las transacciones se usan ampliamente en el procesamiento de datos, especialmente en las operaciones de base de datos y en las transacciones financieras. Las transacciones se usan con más frecuencia cuando el peor escenario para un conjunto de comandos no es que todos produzcan errores, pero que algunos comandos se realizan correctamente mientras que otros fallan, dejando el sistema en un estado dañado, falso o ininterpretable que es difícil de reparar.

CMDLETS DE TRANSACCIÓN

PowerShell incluye varios cmdlets diseñados para administrar transacciones.

  • Start-Transaction: inicia una nueva transacción.
  • Use-Transaction: agrega un comando o expresión a la transacción. El comando debe usar objetos habilitados para transacciones.
  • Deshacer transacción: revierte la transacción para que la transacción no cambie ningún dato.
  • Complete-Transaction: confirma la transacción. Se cambian los datos afectados por la transacción.
  • Get-Transaction: obtiene información sobre la transacción activa.

Para obtener una lista de cmdlets de transacción, escriba:

get-command *transaction

Para obtener información detallada sobre los cmdlets, escriba:

get-help use-transaction -detailed

ELEMENTOS HABILITADOS PARA TRANSACCIONES

Para participar en una transacción, tanto el cmdlet como el proveedor deben admitir transacciones. Esta característica está integrada en los objetos afectados por la transacción.

El proveedor del Registro de PowerShell admite transacciones en Windows Vista. El objeto TransactedString (Microsoft.PowerShell.Commands.Management.TransactedString) funciona con cualquier sistema operativo que ejecute PowerShell.

Otros proveedores de PowerShell pueden admitir transacciones. Para buscar los proveedores de PowerShell en la sesión que admiten transacciones, use el siguiente comando para buscar el valor "Transacciones" en la propiedad Capabilities de los proveedores:

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

Para obtener más información sobre un proveedor, consulte la Ayuda del proveedor. Para obtener ayuda del proveedor, escriba:

get-help <provider-name>

Por ejemplo, para obtener ayuda sobre el proveedor del Registro, escriba:

get-help registry

PARÁMETRO USETRANSACTION

Los cmdlets que pueden admitir transacciones tienen un parámetro UseTransaction. Este parámetro incluye el comando en la transacción activa. Puede usar el nombre completo del parámetro o su alias, "usetx".

El parámetro solo se puede usar cuando la sesión contiene una transacción activa. Si escribe un comando con el parámetro UseTransaction cuando no hay ninguna transacción activa, se produce un error en el comando.

Para buscar cmdlets con el parámetro UseTransaction, escriba:

get-help * -parameter UseTransaction

En PowerShell Core, todos los cmdlets diseñados para trabajar con proveedores de PowerShell admiten transacciones. Como resultado, puede usar los cmdlets de proveedor para administrar transacciones.

Para obtener más información sobre los proveedores de PowerShell, consulte about_Providers.

EL OBJETO TRANSACTION

Las transacciones se representan en PowerShell mediante un objeto de transacción, System.Management.Automation.Transaction.

El objeto tiene las siguientes propiedades:

  • RollbackPreference: contiene el conjunto de preferencias de reversión para la transacción actual. Puede establecer la preferencia de reversión al usar Start-Transaction para iniciar la transacción.

    La preferencia de reversión determina las condiciones en las que la transacción se revierte automáticamente. Los valores válidos son Error, TerminatingError y Never. El valor predeterminado es Error.

  • Estado: contiene el estado actual de la transacción. Los valores válidos son Active, Committed y RolledBack.

  • SubscriberCount: contiene el número de suscriptores a la transacción. Un suscriptor se agrega a una transacción cuando se inicia una transacción mientras otra transacción está en curso. El número de suscriptores se disminuye cuando un suscriptor confirma la transacción.

TRANSACCIONES ACTIVAS

En PowerShell, solo hay una transacción activa a la vez y solo puede administrar la transacción activa. Varias transacciones pueden estar en curso en la misma sesión al mismo tiempo, pero solo la transacción iniciada más recientemente está activa.

Como resultado, no se puede especificar una transacción determinada al usar los cmdlets de transacción. Los comandos siempre se aplican a la transacción activa.

Esto es más evidente en el comportamiento del cmdlet Get-Transaction. Al escribir un comando Get-Transaction, Get-Transaction siempre obtiene un solo objeto de transacción. Este objeto es el objeto que representa la transacción activa.

Para administrar una transacción diferente, primero debe finalizar la transacción activa, ya sea confirmandola o reviertiendola. Al hacerlo, la transacción anterior se activa automáticamente. Las transacciones se activan en el orden inverso del que se inician, por lo que la transacción iniciada más recientemente siempre está activa.

SUSCRIPTORES Y TRANSACCIONES INDEPENDIENTES

Si inicia una transacción mientras otra transacción está en curso, de forma predeterminada, PowerShell no inicia una nueva transacción. En su lugar, agrega un "suscriptor" a la transacción actual.

Cuando una transacción tiene varios suscriptores, un único comando Deshacer-Transaction en cualquier punto revierte toda la transacción para todos los suscriptores. Sin embargo, para confirmar la transacción, debe escribir un comando Complete-Transaction para cada suscriptor.

Para buscar el número de suscriptores a una transacción, compruebe la propiedad SubscriberCount del objeto de transacción. Por ejemplo, el siguiente comando usa el cmdlet Get-Transaction para obtener el valor de la propiedad SubscriberCount de la transacción activa:

(Get-Transaction).SubscriberCount

Agregar un suscriptor es el comportamiento predeterminado porque la mayoría de las transacciones que se inician mientras otra transacción está en curso están relacionadas con la transacción original. En el modelo típico, un script que contiene una transacción llama a un script auxiliar que contiene su propia transacción. Dado que las transacciones están relacionadas, deben revertirse o confirmarse como una unidad.

Sin embargo, puede iniciar una transacción independiente de la transacción actual mediante el parámetro Independent del cmdlet Start-Transaction.

Al iniciar una transacción independiente, Start-Transaction crea un nuevo objeto de transacción y la nueva transacción se convierte en la transacción activa. La transacción independiente se puede confirmar o revertir sin afectar a la transacción original.

Cuando finaliza la transacción independiente (confirmada o revierte), la transacción original vuelve a ser la transacción activa.

CAMBIO DE DATOS

Cuando se usan transacciones para cambiar los datos, los datos afectados por la transacción no se cambian hasta que se confirma la transacción. Sin embargo, los comandos que no forman parte de la transacción pueden cambiar los mismos datos.

Tenga esto en cuenta cuando use transacciones para administrar datos compartidos. Normalmente, las bases de datos tienen mecanismos que bloquean los datos mientras trabaja en ellos, lo que impide que otros usuarios y otros comandos, scripts y funciones lo cambien.

Sin embargo, el bloqueo es una característica de la base de datos. No está relacionado con las transacciones. Si está trabajando en un sistema de archivos habilitado para transacciones u otro almacén de datos, los datos se pueden cambiar mientras la transacción está en curso.

Ejemplos

En los ejemplos de esta sección se usa el proveedor del Registro de PowerShell y se supone que está familiarizado con él. Para obtener información sobre el proveedor del Registro, escriba "get-help registry".

EJEMPLO 1: CONFIRMACIÓN DE UNA TRANSACCIÓN

Para crear una transacción, use el cmdlet Start-Transaction. El siguiente comando inicia una transacción con la configuración predeterminada.

start-transaction

Para incluir comandos en la transacción, use el parámetro UseTransaction del cmdlet . De forma predeterminada, los comandos no se incluyen en la transacción,

Por ejemplo, el siguiente comando, que establece la ubicación actual en la clave de software de la unidad HKCU: no se incluye en la transacción.

cd hkcu:\Software

El siguiente comando, que crea la clave MyCompany, usa el parámetro UseTransaction del cmdlet New-Item para incluir el comando en la transacción activa.

new-item MyCompany -UseTransaction

El comando devuelve un objeto que representa la nueva clave, pero porque el comando forma parte de la transacción, el registro aún no se ha cambiado.

Hive: HKEY_CURRENT_USER\Software

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

Para confirmar la transacción, use el cmdlet Complete-Transaction. Dado que siempre afecta a la transacción activa, no se puede especificar la transacción.

complete-transaction

Como resultado, la clave MyCompany se agrega al Registro.

dir m*
Hive: HKEY_CURRENT_USER\software

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

EJEMPLO 2: REVERTIR UNA TRANSACCIÓN

Para crear una transacción, use el cmdlet Start-Transaction. El siguiente comando inicia una transacción con la configuración predeterminada.

start-transaction

El siguiente comando, que crea la clave MyOtherCompany, usa el parámetro UseTransaction del cmdlet New-Item para incluir el comando en la transacción activa.

new-item MyOtherCompany -UseTransaction

El comando devuelve un objeto que representa la nueva clave, pero porque el comando forma parte de la transacción, el registro aún no se ha cambiado.

Hive: HKEY_CURRENT_USER\Software

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

Para revertir la transacción, use el cmdlet Undo-Transaction. Dado que siempre afecta a la transacción activa, no se especifica la transacción.

Undo-transaction

El resultado es que la clave MyOtherCompany no se agrega al registro.

dir m*
Hive: HKEY_CURRENT_USER\software

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

EJEMPLO 3: VISTA PREVIA DE UNA TRANSACCIÓN

Normalmente, los comandos usados en los datos de cambio de transacción. Sin embargo, los comandos que obtienen datos también son útiles en una transacción, ya que obtienen datos dentro de la transacción. Esto proporciona una vista previa de los cambios que la confirmación de la transacción provocaría.

En el ejemplo siguiente se muestra cómo usar el comando Get-ChildItem (el alias es "dir") para obtener una vista previa de los cambios en una transacción.

El comando siguiente inicia una transacción.

start-transaction

El siguiente comando usa el cmdlet New-ItemProperty para agregar la entrada del Registro MyKey a la clave MyCompany. El comando usa el parámetro UseTransaction para incluir el comando en la transacción.

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

El comando devuelve un objeto que representa la nueva entrada del Registro, pero no se cambia la entrada del Registro.

MyKey
-----
123

Para obtener los elementos que están actualmente en el registro, use un comando Get-ChildItem ("dir") sin el parámetro UseTransaction. El comando siguiente obtiene elementos que comienzan por "M".

dir m*

El resultado muestra que aún no se han agregado entradas a la clave MyCompany.

Hive: HKEY_CURRENT_USER\Software

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

Para obtener una vista previa del efecto de confirmar la transacción, escriba un comando Get-ChildItem ("dir") con el parámetro UseTransaction. Este comando tiene una vista de los datos desde dentro de la transacción.

dir m* -useTransaction

El resultado muestra que, si se confirma la transacción, la entrada MyKey se agregará a la clave MyCompany.

Hive: HKEY_CURRENT_USER\Software

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

EJEMPLO 4: COMBINACIÓN DE COMANDOS TRANSACCIONADOS Y NO TRANSACCIONADOS

Puede escribir comandos no transaccionados durante una transacción. Los comandos no transaccionados afectan inmediatamente a los datos, pero no afectan a la transacción. El comando siguiente inicia una transacción en la clave del Registro HKCU:\Software.

start-transaction

Los tres comandos siguientes usan el cmdlet New-Item para agregar claves al Registro. Los comandos primero y tercer usan el parámetro UseTransaction para incluir los comandos en la transacción. El segundo comando omite el parámetro . Dado que el segundo comando no se incluye en la transacción, es efectivo inmediatamente.

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

Para ver el estado actual del registro, use un comando Get-ChildItem ("dir") sin el parámetro UseTransaction. Este comando obtiene elementos que comienzan por "M".

dir m*

El resultado muestra que la clave MyCompany2 se agrega al Registro, pero no se agregan las claves MyCompany1 y MyCompany3, que forman parte de la transacción.

Hive: HKEY_CURRENT_USER\Software

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

El siguiente comando confirma la transacción.

complete-transaction

Ahora, las claves que se agregaron como parte de la transacción aparecen en el Registro.

dir m*
Hive: HKEY_CURRENT_USER\Software

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

EJEMPLO 5: USO DE REVERSIÓN AUTOMÁTICA

Cuando un comando de una transacción genera un error de cualquier tipo, la transacción se revierte automáticamente.

Este comportamiento predeterminado está diseñado para scripts que ejecutan transacciones. Los scripts suelen probarse correctamente e incluyen lógica de control de errores, por lo que no se esperan errores y deben finalizar la transacción.

El primer comando inicia una transacción en la clave del Registro HKCU:\Software.

start-transaction

El siguiente comando usa el cmdlet New-Item para agregar la clave MyCompany al Registro. El comando usa el parámetro UseTransaction (el alias es "usetx") para incluir el comando en la transacción.

New-Item MyCompany -UseTX

Dado que la clave MyCompany ya existe en el Registro, se produce un error en el comando y se revierte la transacción.

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

Un comando Get-Transaction confirma que la transacción se ha revertido y que subscriberCount es 0.

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

EJEMPLO 6: CAMBIAR LA PREFERENCIA DE REVERSIÓN

Si desea que la transacción sea más tolerante a errores, puede usar el parámetro RollbackPreference de Start-Transaction para cambiar la preferencia.

El siguiente comando inicia una transacción con una preferencia de reversión de "Nunca".

start-transaction -rollbackpreference Never

En este caso, cuando se produce un error en el comando, la transacción no se revierte automáticamente.

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

Dado que la transacción sigue activa, puede volver a enviar el comando como parte de la transacción.

New-Item MyOtherCompany -UseTX

EJEMPLO 7: USO DEL CMDLET USE-TRANSACTION

El cmdlet Use-Transaction permite realizar scripts directos en objetos de Microsoft .NET Framework habilitados para transacciones. Use-Transaction toma un bloque de script que solo puede contener comandos y expresiones que usan objetos de .NET Framework habilitados para transacciones, como instancias de la clase Microsoft.PowerShell.Commands.Management.TransactedString.

El comando siguiente inicia una transacción.

start-transaction

El siguiente comando New-Object crea una instancia de la clase TransactedString y la guarda en la variable $t.

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

El siguiente comando usa el método Append del objeto TransactedString para agregar texto a la cadena. Dado que el comando no forma parte de la transacción, el cambio es efectivo inmediatamente.

$t.append("Windows")

El siguiente comando usa el mismo método Append para agregar texto, pero agrega el texto como parte de la transacción. El comando se incluye entre llaves y se establece como el valor del parámetro ScriptBlock de Use-Transaction. Se requiere el parámetro UseTransaction (UseTx).

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

Para ver el contenido actual de la cadena de transacción en $t, use el método ToString del objeto TransactedString.

$t.tostring()

La salida muestra que solo los cambios no transaccionados son efectivos.

Windows

Para ver el contenido actual de la cadena transaccionada en $t desde dentro de la transacción, inserte la expresión en un comando Use-Transaction.

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

La salida muestra la vista de transacción.

PowerShell

El siguiente comando confirma la transacción.

complete-transaction

Para ver la cadena final:

$t.tostring()
PowerShell

EJEMPLO 8: ADMINISTRACIÓN DE TRANSACCIONES DE VARIOS SUSCRIPTORES

Cuando se inicia una transacción mientras otra transacción está en curso, PowerShell no crea una segunda transacción de forma predeterminada. En su lugar, agrega un suscriptor a la transacción actual.

En este ejemplo se muestra cómo ver y administrar una transacción de varios suscriptores.

Comience iniciando una transacción en la clave HKCU:\Software.

start-transaction

El comando siguiente usa el comando Get-Transaction para obtener la transacción activa.

get-transaction

El resultado muestra el objeto que representa la transacción activa.

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

El siguiente comando agrega la clave MyCompany al Registro. El comando usa el parámetro UseTransaction para incluir el comando en la transacción.

new-item MyCompany -UseTransaction

El comando siguiente usa el comando Start-Transaction para iniciar una transacción. Aunque este comando se escribe en el símbolo del sistema, es más probable que este escenario se produzca cuando se ejecuta un script que contiene una transacción.

start-transaction

Un comando Get-Transaction muestra que se incrementa el número de suscriptores en el objeto de transacción. El valor es ahora 2.

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

El siguiente comando usa el cmdlet New-ItemProperty para agregar la entrada del Registro MyKey a la clave MyCompany. Usa el parámetro UseTransaction para incluir el comando en la transacción.

new-itemproperty -path MyCompany -name MyKey -UseTransaction

La clave MyCompany no existe en el Registro, pero este comando se realiza correctamente porque los dos comandos forman parte de la misma transacción.

El siguiente comando confirma la transacción. Si revierte la transacción, la transacción se revertiría para todos los suscriptores.

complete-transaction

Un comando Get-Transaction muestra que el número de suscriptores del objeto de transacción es 1, pero el valor de Status sigue siendo Activo (no confirmado).

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

Para terminar de confirmar la transacción, escriba un segundo comando Complete- Transaction. Para confirmar una transacción de varios suscriptores, debe escribir un comando Complete-Transaction para cada comando Start-Transaction.

complete-transaction

Otro comando Get-Transaction muestra que se ha confirmado la transacción.

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

EJEMPLO 9: ADMINISTRACIÓN DE TRANSACCIONES INDEPENDIENTES

Al iniciar una transacción mientras otra transacción está en curso, puede usar el parámetro Independent de Start-Transaction para hacer que la nueva transacción sea independiente de la transacción original.

Al hacerlo, Start-Transaction crea un nuevo objeto de transacción y convierte la nueva transacción en la transacción activa.

Comience iniciando una transacción en la clave HKCU:\Software.

start-transaction

El comando siguiente usa el comando Get-Transaction para obtener la transacción activa.

get-transaction

El resultado muestra el objeto que representa la transacción activa.

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

El siguiente comando agrega la clave del Registro MyCompany como parte de la transacción. Usa el parámetro UseTransaction (UseTx) para incluir el comando en la transacción activa.

new-item MyCompany -use

El comando siguiente inicia una nueva transacción. El comando usa el parámetro Independent para indicar que esta transacción no es un suscriptor de la transacción activa.

start-transaction -independent

Al crear una transacción independiente, la transacción nueva (creada más recientemente) se convierte en la transacción activa. Puede usar un comando Get-Transaction para obtener la transacción activa.

get-transaction

Tenga en cuenta que subscriberCount de la transacción es 1, lo que indica que no hay otros suscriptores y que la transacción es nueva.

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

La nueva transacción debe finalizarse (confirmada o revertida) para poder administrar la transacción original.

El siguiente comando agrega la clave MyOtherCompany al Registro. Usa el parámetro UseTransaction (UseTx) para incluir el comando en la transacción activa.

new-item MyOtherCompany -usetx

Ahora, revierte la transacción. Si hubiera una sola transacción con dos suscriptores, la reversión de la transacción revertiría toda la transacción para todos los suscriptores.

Sin embargo, dado que estas transacciones son independientes, revertir la transacción más reciente cancela los cambios del Registro y realiza la transacción original la transacción activa.

undo-transaction

Un comando Get-Transaction confirma que la transacción original todavía está activa en la sesión.

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

El siguiente comando confirma la transacción activa.

complete-transaction

Un comando Get-ChildItem muestra que se ha cambiado el registro.

dir m*
Hive: HKEY_CURRENT_USER\Software

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

Consulte también