Compartir a través de


Acerca de las transacciones

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 por completo ("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 utilizan con mayor frecuencia cuando el peor de los casos para un conjunto de comandos no es que todos fallen, sino que algunos comandos se realicen 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 modifique 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

TRANSACTION-ENABLED ELEMENTOS

Para participar en una transacción, tanto el cmdlet como el proveedor deben admitir transacciones. Esta función está integrada en los objetos que se ven 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 de 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

EL 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 utilizar 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 el núcleo de PowerShell, todos los cmdlets diseñados para funcionar 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 DE TRANSACCIÓN

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 cuando utilice 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 Activo, Confirmado y Revertido.

  • SubscriberCount: Contiene el número de suscriptores de 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 introducir un comando Get-Transaction, siempre Get-Transaction 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 al en que se inician, de modo que la transacción iniciada más recientemente siempre está activa.

SUSCRIPTORES Y TRANSACCIONES INDEPENDIENTES

Si inicia una transacción mientras otra 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 solo comando Undo-Transaction en cualquier momento revierte toda la transacción para todos los suscriptores. Sin embargo, para confirmar la transacción, debe introducir 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 que sea 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 utilizan transacciones para cambiar datos, los datos que se ven afectados por la transacción no se modifican hasta que se confirma la transacción. Sin embargo, los mismos datos pueden ser modificados por comandos que no forman parte de la transacción.

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: CONFIRMAR 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 dado que el comando forma parte de la transacción, el Registro aún no se ha modificado.

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 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 dado que el comando forma parte de la transacción, el Registro aún no se ha modificado.

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 utilizar 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 la entrada del Registro no se modifica.

MyKey
-----
123

Para obtener los elementos que se encuentran 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 ha agregado ninguna entrada 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 NON-TRANSACTED

Puede escribir comandos no transaccionados durante una transacción. Los comandos no transaccionados afectan a los datos inmediatamente, pero no afectan a la transacción. El siguiente comando inicia una transacción en la HKCU:\Clave del Registro de 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 está incluido en la transacción, entra en vigor 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 con "M".

dir m*

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

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 LA 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. Por lo general, los scripts están bien probados 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 utiliza 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 usen 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 utiliza 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 entra en vigor 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 está entre llaves y se establece como el valor del parámetro ScriptBlock de Use-Transaction. El parámetro UseTransaction (UseTx) es obligatorio.

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 de transacción en $t desde dentro de la transacción, incruste 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: ADMINISTRAR MULTI-SUBSCRIBER TRANSACCIONES

Al iniciar una transacción mientras otra 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 siguiente comando utiliza 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 siguiente comando utiliza 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 el recuento de suscriptores en el objeto de transacción se incrementa. 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 recuento de suscriptores en el objeto de transacción es 1, pero el valor de Status sigue siendo Active (not Committed).

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 especificar un comando Complete-Transaction para cada comando Start-Transaction.

complete-transaction

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

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

EJEMPLO 9: GESTIÓN DE TRANSACCIONES INDEPENDIENTES

Al iniciar una transacción mientras otra transacción está en curso, puede utilizar 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 siguiente comando utiliza 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. Utiliza 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 utiliza 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 utilizar 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. Utiliza 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 sigue 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                      {}

VÉASE TAMBIÉN

Inicio-Transacción

Obtener-Transacción

Transacción completa

Deshacer-Transacción

Uso-Transacción

Get-PSProvider

Get-ChildItem

about_Providers