about_Transactions

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0

TEMA

about_Transactions

DESCRIPCIÓN BREVE

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

DESCRIPCIÓN LARGA

Las transacciones se admiten en Windows PowerShell a partir de Windows PowerShell 2.0. Esta característica le permite iniciar una transacción para indicar los comandos que forman parte de la transacción y para confirmar o revertir una transacción.

ACERCA DE LAS TRANSACCIONES

En Windows PowerShell, una transacción es un conjunto de uno o varios comandos que se administran como una unidad lógica. Una transacción puede completarse ("confirmarse"), lo que cambia los datos a los que afecta la transacción. O bien, una transacción puede deshacerse por completo ("revertirse") para que la transacción no cambie los datos a los que afecta.

Como los comandos en una transacción se administran como una unidad, se confirman o se revierten todos los comandos.

Las transacciones se utilizan ampliamente en el procesamiento de datos, especialmente en las operaciones de base de datos y las transacciones financieras. Las transacciones se utilizan con más frecuencia cuando el peor escenario posible para un conjunto de comandos no es que ninguno de ellos se realice correctamente, sino que algunos comandos sí lo hagan mientras que otros no, por lo que el sistema queda en un estado dañado, falso o no interpretable que es difícil de reparar.

CMDLETS DE TRANSACCIONES

Windows PowerShell incluye varios cmdlets diseñados para administrar transacciones.

      Cmdlet                 Description
      --------------         ---------------------------------    
      Start-Transaction      Starts a new transaction. 

      Use-Transaction        Adds a command or expression to the
                             transaction. The command must use
                             transaction-enabled objects.

      Undo-Transaction       Rolls back the transaction so that
                             no data is changed by the transaction.

      Complete-Transaction   Commits the transaction. The data
                             affected by the transaction is changed.

      Get-Transaction        Gets information about the active
                             transaction.

Para obtener una lista de cmdlets de transacciones, escriba:

          get-command *transaction

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

          get-help <cmdlet-name> -detailed

Por ejemplo:

          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 a los que afecta la transacción.

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

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

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

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

        get-help <provider-name>

Por ejemplo, para obtener ayuda sobre el proveedor Registry, 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 usar el nombre del parámetro completo o su alias "usetx".

El parámetro solo se puede usar si 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 los cmdlets con el parámetro UseTransaction, escriba:

        get-help * -parameter UseTransaction

En el núcleo de Windows PowerShell, todos los cmdlets diseñados para trabajar con proveedores de Windows PowerShell admiten transacciones. Como resultado, puede usar los cmdlets de proveedores para administrar transacciones.

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

EL OBJETO DE TRANSACCIÓN

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

El objeto tiene las siguientes propiedades:

RollbackPreference:

Contiene la preferencia de reversión definida para la transacción actual. Puede establecer la preferencia de reversión si utiliza 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.

Status:

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. Se agrega un suscriptor a la transacción cuando una transacción se inicia mientras otra transacción está en curso. El recuento de suscriptores se reduce cuando un suscriptor confirma la transacción.

TRANSACCIONES ACTIVAS

En Windows PowerShell, solo hay una transacción activa en un momento concreto y es posible administrar solo la transacción activa. Puede haber varias transacciones en curso en la misma sesión al mismo tiempo, pero solamente la transacción iniciada de forma más reciente está activa.

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

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

Para administrar una transacción diferente, primero debe finalizar la transacción activa, bien confirmándola o deshaciéndola. Al hacerlo, la transacción anterior se vuelve activa automáticamente. Las transacciones se vuelven activas en el orden inverso al que se iniciaron, para que la transacción que se inició más recientemente esté siempre activa.

SUSCRIPTORES Y TRANSACCIONES INDEPENDIENTES

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

Cuando una transacción tiene varios suscriptores, un único comando Undo-Transaction en cualquier momento revierte la transacción completa para todos los suscriptores. Sin embargo, para confirmar la transacción, debe especificar 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 comando siguiente usa el cmdlet Get-Transaction para obtener el valor de la propiedad SubscriberCount de la transacción activa:

          (Get-Transaction).SubscriberCount

El comportamiento predeterminado es agregar un suscriptor, ya que la mayoría de 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 de aplicación auxiliar que contiene su propia transacción. Como las transacciones están relacionadas, deben revertirse o confirmarse como una unidad.Insert section body here.

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

Cuando se inicia 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 que afecte a la transacción original.

Cuando finaliza la transacción independiente (confirmada o revertida), la transacción original se convierte en la transacción activa de nuevo.

DATOS CAMBIANTES

Cuando se usan transacciones para cambiar datos, los datos a los que afecta la transacción no se modifican hasta que se confirme la transacción. Sin embargo, es posible que se cambien dichos datos mediante comandos que no formen parte de la transacción.

Téngalo en cuenta cuando utilice transacciones para administrar datos compartidos. Normalmente, las bases de datos tienen mecanismos que bloquean los datos mientras trabaja con ellos, para evitar así que otros usuarios, comandos, scripts y funciones los cambien.

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

EJEMPLOS

En los ejemplos de esta sección se utiliza el proveedor Registry de Windows PowerShell y se supone que está familiarizado con él. Para más información sobre el proveedor Registry, escriba "get-help registry".

EJEMPLO 1: CONFIRMACIÓN DE UNA TRANSACCIÓN

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

        start-transaction

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

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

        cd hkcu:\Software

El comando siguiente, que crea la clave MyCompany, utiliza 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 clave nueva, pero como el comando es parte de la transacción, el registro aún no ha cambiado.

        Hive: HKEY_CURRENT_USER\Software

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

Para confirmar la transacción, use el cmdlet Complete-Transaction. Como 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: REVERSIÓN DE UNA TRANSACCIÓN

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

        start-transaction

El comando siguiente, que crea la clave MyOtherCompany, utiliza 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 clave nueva, pero como el comando es parte de la transacción, el registro aún no ha cambiado.

        Hive: HKEY_CURRENT_USER\Software

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

Para revertir la transacción, use el cmdlet Undo-Transaction. Como siempre afecta a la transacción activa, no especifique 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 que se utilizan en una transacción cambian datos. Sin embargo, los comandos que obtienen datos también son útiles en una transacción, porque reciben datos dentro de la transacción. Esto ofrece una vista previa de los cambios que provocaría la confirmación de la transacción.

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 comando siguiente usa el cmdlet New-ItemProperty para agregar la entrada de 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 cambia.

        MyKey
        -----
        123

Para obtener los elementos que están actualmente en el registro, utilice un comando Get-ChildItem ("dir") sin el parámetro UseTransaction. El comando siguiente obtiene los 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.Insert section body here.

        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 LOS COMANDOS DE TRANSACCIÓN Y DE NO TRANSACCIÓN

Puede escribir comandos de no transacción durante una transacción. Los comandos de no transacción afectan a los datos inmediatamente, 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 utilizan el cmdlet New-Item para agregar claves al registro. Los comandos primero y tercero usan el parámetro UseTransaction para incluir los comandos en la transacción. El segundo comando omite el parámetro. Como el segundo comando no se incluye 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, utilice un comando Get-ChildItem ("dir") sin el parámetro UseTransaction. Este comando obtiene los elementos que comienzan por "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

Si un comando en 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. Normalmente, los scripts se prueban correctamente e incluyen lógica de control de errores, por lo que no se esperan errores y la transacción debe finalizar.

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

Como la clave MyCompany ya existe en el registro, el comando produce un error y la transacción se revierte.

        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 el valor de SubscriberCount es 0.

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

EJEMPLO 6: CAMBIO DE LA PREFERENCIA DE REVERSIÓN

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

El comando siguiente inicia una transacción con una preferencia de reversión de "Never".Insert section body here.

         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

Como la transacción aún está 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 le permite dirigir scripting a 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 comando siguiente utiliza el método Append del objeto TransactedString para agregar texto a la cadena. Como el comando no forma parte de la transacción, el cambio entra en vigor inmediatamente.

        $t.append("Windows")

El siguiente comando utiliza el mismo método Append para agregar texto, pero agrega el texto como parte de la transacción. El comando se especifica 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 transacciones en $t, utilice el método ToString del objeto TransactedString.

        $t.tostring()

El resultado muestra que solamente los cambios sin transacciones están en vigor.

        Windows

Para ver el contenido actual de la cadena de transacciones 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.

        Windows PowerShell

El siguiente comando confirma la transacción.

        complete-transaction

Para ver la cadena final:

        $t.tostring()

        Windows PowerShell

EJEMPLO 7: ADMINISTRACIÓN DE TRANSACCIONES DE VARIOS SUSCRIPTORES

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

Este ejemplo muestra cómo ver y administrar una transacción de varios suscriptores.

Empiece por iniciar 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 especifica en el símbolo del sistema, es más probable que este escenario se dé cuando ejecuta un script que contiene una transacción.

        start-transaction

Un comando Get-Transaction muestra que el recuento de suscriptores se incrementa en el objeto de transacción. Ahora, el valor es 2.

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

El comando siguiente usa el cmdlet New-ItemProperty para agregar la entrada de 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 ejecuta correctamente porque los dos comandos forman parte de la misma transacción.

El siguiente comando confirma la transacción. Si se revirtiera 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 (no 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 por 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 8: ADMINISTRACIÓN DE TRANSACCIONES INDEPENDIENTES

Cuando se inicia una transacción mientras otra 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.

Cuando lo haga, Start-Transaction crea un nuevo objeto de transacción y convierte la nueva transacción en la activa.

Empiece por iniciar 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 utiliza el parámetro Independent para indicar que esta transacción no es un suscriptor de la transacción activa.

         start-transaction -independent

Cuando se crea una transacción independiente, la transacción nueva (la 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 el valor del elemento SubscriberCount de la transacción es 1, lo que indica que no existen otros suscriptores y que la transacción es nueva.

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

La nueva transacción debe finalizar (confirmada o revertida) antes de 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, revierta la transacción. Si hubiera una transacción única con dos suscriptores, al revertir la transacción se desharía toda la transacción para todos los suscriptores.

Sin embargo, como estas transacciones son independientes, al revertir la transacción más reciente se cancelarían los cambios del registro y la transacción original se convertiría en la 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 cambió el registro.

        dir m*


        Hive: HKEY_CURRENT_USER\Software

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

VEA TAMBIÉN

Start-Transaction

Get-Transaction

Complete-Transaction

Undo-Transaction

Use-Transaction

Registry (proveedor)

about_Providers

Get-PSProvider

Get-ChildItem