TEMA about_Transactions DESCRIPCIÓN BREVE Describe cómo se administran las operaciones que admiten transacciones en Windows PowerShell. DESCRIPCIÓN DETALLADA Las transacciones se admiten en Windows PowerShell a partir de Windows PowerShell 2.0. Esta característica permite iniciar una transacción, indicar qué comandos forman parte de la misma y confirmarla o revertirla. 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 se puede completar ("confirmar"), con lo que se cambian los datos afectados por la misma. También se puede deshacer ("revertir") totalmente, con lo no se cambian los datos afectados por la citada transacción. Dado que los comandos de una transacción se administran como una unidad, o todos se confirman o todos se revierten. Las transacciones se utilizan bastante en el procesamiento de datos, particularmente en operaciones de bases de datos y en transacciones financieras. Las transacciones no suelen utilizarse cuando, en un conjunto de comandos, se produce un error en la ejecución de todos ellos, sino que se utilizan principalmente en los casos en que unos comandos se ejecutan correctamente y otros no, con lo que el sistema queda en un estado difícil de reparar debido a posibles daños, comportamiento incorrecto o problemas de interpretación. CMDLETS DE TRANSACCIONES Windows PowerShell incluye varios cmdlets diseñados para administrar transacciones. Cmdlet Descripción -------------- --------------------------------- Start-Transaction Inicia una nueva transacción. Use-Transaction Agrega un comando o una expresión a la transacción. El comando debe utilizar objetos habilitados para transacciones. Undo-Transaction Revierte la transacción para que no se cambie ningún dato. Complete-Transaction Confirma la transacción. Los datos afectados por la transacción se cambian. Get-Transaction Obtiene información acerca de la transacción activa. Para obtener una lista de cmdlets de transacciones, escriba: get-command *transaction Para obtener información detallada acerca de los cmdlets, escriba: get-help <nombreDeCmdlet> -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 afectados por la transacción. El proveedor del Registro 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 buscar los proveedores de Windows PowerShell de una sesión que admiten transacciones, utilice el comando siguiente para buscar el valor "Transactions" en la propiedad Capabilities de proveedores: get-psprovider | where {$_.Capabilities -like "*transactions*"} Para obtener más información acerca de un proveedor, vea la Ayuda correspondiente a dicho proveedor. Para ver la Ayuda de un proveedor, escriba: get-help <nombreDeProveedor> Por ejemplo, para ver la Ayuda del 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 usar el nombre completo del parámetro o su alias, "usetx". El parámetro se puede utilizar sólo cuando la sesión contiene una transacción activa. Si escribe un comando con el parámetro UseTransaction sin que haya una transacción activa, se producirá un error en el comando. Para buscar cmdlets con el parámetro UseTransaction, escriba: get-help * -parameter UseTransaction En Windows PowerShell, todos los cmdlets diseñados para funcionar con proveedores de Windows PowerShell admiten transacciones. Como consecuencia, se pueden utilizar los cmdlets de proveedores para administrar transacciones. Para obtener más información sobre los proveedores de Windows PowerShell, vea about_Providers. EL OBJETO DE TRANSACCIÓN En Windows PowerShell, el objeto de transacción System.Management.Automation.Transaction representa las transacciones. Este objeto tiene las propiedades siguientes: RollbackPreference: Contiene la preferencia de reversión establecida para la transacción actual. Puede establecer la preferencia de reversión al utilizar Start-Transaction para iniciar la transacción. La preferencia de reversión determina las condiciones bajo 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 para la transacción. Un suscriptor se agrega a una transacción cuando se inicia una transacción mientras otra está en curso. El recuento de suscriptores se reduce cuando un suscriptor confirma la transacción. TRANSACCIONES ACTIVAS En Windows PowerShell, sólo hay una transacción activa a la vez y solamente se puede administrar la transacción activa. Puede haber varias transacciones en curso al mismo tiempo en la misma sesión, pero únicamente la última transacción iniciada estará activa. Como consecuencia, no se puede especificar una transacción concreta al utilizar los cmdlets de transacciones. Los comandos siempre se aplican a la transacción activa. Esto se puede observar de forma evidente en el comportamiento del cmdlet Get-Transaction. Cuando se escribe un comando Get-Transaction, siempre obtiene un solo 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, ya sea confirmándola o revirtiéndola. Cuando se realiza esta acción, la transacción anterior vuelve a estar activa automáticamente. Las transacciones vuelven a activarse en orden inverso al orden en que se iniciaron, por lo que la última transacción iniciada siempre está activa. SUSCRIPTORES Y TRANSACCIONES INDEPENDIENTES Si inicia una transacción mientras otra está en curso, Windows PowerShell no inicia la nueva transacción de forma predeterminada. En su lugar, agrega un "suscriptor" a la transacción actual. Cuando una transacción tiene varios suscriptores, un único comando Undo-Transaction en cualquier punto revierte la transacción completa para todos los suscriptores. Sin embargo, para confirmar la transacción, se debe escribir un comando Complete-Transaction para cada suscriptor. Para buscar el número de suscriptores para una transacción, compruebe la propiedad SubscriberCount del objeto de transacción. Por ejemplo, el comando siguiente utiliza 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, porque la mayor parte de las transacciones que se inician mientras otra 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. Como las transacciones están relacionadas, se deben revertir o confirmar como una unidad. No obstante, se puede iniciar una transacción que sea independiente de la transacción actual utilizando el parámetro Independent del cmdlet Start-Transaction. Cuando se inicia una transacción independiente, Start-Transactio n 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 la transacción independiente se finaliza (se confirma o se revierte), la transacción original vuelve a convertirse en la transacción activa. CAMBIAR DATOS Cuando se usa una transacción para cambiar datos, los datos afectados no se cambian hasta que se confirma la transacción. Sin embargo, los mismos datos pueden ser cambiados por comandos que no forman parte de la transacción. Tenga esto presente cuando esté utilizando transacciones para administrar datos compartidos. Normalmente, las bases de datos tienen mecanismos que bloquean los datos mientras se está trabajando con ellos, evitando que otros usuarios, y otros comandos, scripts y funciones, los 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 o en 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 usa el proveedor del Registro de Windows PowerShell y se supone que se está familiarizado con este proveedor. Para obtener información acerca del proveedor del Registro, escriba "get-help registry". EJEMPLO 1: CONFIRMAR UNA TRANSACCIÓN Para crear una transacción, utilice el cmdlet Start-Transaction. El comando siguiente inicia una transacción con la configuración predeterminada. start-transaction Para incluir comandos en la transacción, utilice el parámetro UseTransaction del cmdlet. De forma predeterminada, no se incluyen comandos en la transacción. Por ejemplo, el comando siguiente, que establece la ubicación actual en la clave 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 nueva clave, pero como el comando forma parte de la transacción, el Registro no se cambia todavía. Hive: HKEY_CURRENT_USER\Software SKC VC Nombre Propiedad --- -- ---- -------- 0 0 MyCompany {} Para confirmar la transacción, utilice el cmdlet Complete-Transaction. Como siempre afecta a la transacción activa, no se puede especificar la transacción. complete-transaction Como consecuencia, la clave MyCompany se agrega al Registro. dir m* Hive: HKEY_CURRENT_USER\software SKC VC Nombre Propiedad --- -- ---- -------- 83 1 Microsoft {(Valor predeterminado)} 0 0 MyCompany {} EJEMPLO 2: REVERTIR UNA TRANSACCIÓN Para crear una transacción, utilice 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 nueva clave, pero como el comando forma parte de la transacción, el Registro no se cambia todavía. Hive: HKEY_CURRENT_USER\Software SKC VC Nombre Propiedad --- -- ---- -------- 0 0 MyOtherCompany {} Para revertir la transacción, utilice el cmdlet Undo-Transaction. Como siempre afecta a la transacción activa, no se puede especificar 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 Nombre Propiedad --- -- ---- -------- 83 1 Microsoft {(Valor predeterminado)} 0 0 MyCompany {} EJEMPLO 3: TENER UNA VISTA PREVIA DE UNA TRANSACCIÓN Normalmente, los comandos utilizados en una transacción cambian datos. Sin embargo, los comandos que obtienen datos también son útiles en una transacción, porque obtienen datos dentro de la misma. Esto proporciona una vista previa de los cambios que se producirían al confirmar la transacción. En el ejemplo siguiente se muestra la forma de utilizar el comando Get- ChildItem (el alias es "dir") para tener una vista previa de los cambios producidos en una transacción. El comando siguiente inicia una transacción. start-transaction El comando siguiente utiliza el cmdlet New-ItemProperty para agregar la entrada del Registro MyKey a la clave MyCompany. Utiliza 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 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 elementos que comienzan por "M". dir m* El resultado muestra que no se han agregado entradas todavía a la clave MyCompany. Hive: HKEY_CURRENT_USER\Software SKC VC Nombre Propiedad --- -- ---- -------- 83 1 Microsoft {(Valor predeterminado)} 0 0 MyCompany {} Para tener una vista previa del efecto que produce la confirmación de la transacción, escriba un comando Get-ChildItem ("dir") con el parámetro UseTransaction. Este comando tiene una vista de los datos desde la transacción. dir m* -useTransaction El resultado muestra que, si la transacción se confirma, la entrada MyKey se agregará a la clave MyCompany. Hive: HKEY_CURRENT_USER\Software SKC VC Nombre Propiedad --- -- ---- -------- 83 1 Microsoft {(Valor predeterminado)} 0 1 MyCompany {MyKey} EJEMPLO 4: COMBINAR COMANDOS QUE ADMITEN TRANSACCIONES CON COMANDOS QUE NO LAS ADMITEN Puede escribir comandos que no admiten transacciones durante una transacción. Los comandos que no admiten transacciones 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 siguientes comandos 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, se aplica 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 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 Nombre Propiedad --- -- ---- -------- 83 1 Microsoft {(Valor predeterminado)} 0 0 MyCompany2 {} El comando siguiente 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 Nombre Propiedad --- -- ---- -------- 83 1 Microsoft {(Valor predeterminado)} 0 0 MyCompany1 {} 0 0 MyCompany2 {} 0 0 MyCompany3 {} EJEMPLO 5: UTILIZAR 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 los scripts que ejecutan transacciones. Normalmente, los scripts se prueban e incluyen lógica de control de errores, por lo que no se espera que se produzcan errores y deben terminar la transacción. El primer comando inicia una transacción en la clave del Registro HKCU:\Software. start-transaction El comando siguiente utiliza el cmdlet New-Item para agregar la clave MyCompany al Registro. Utiliza el parámetro UseTransaction, cuyo alias es "usetx", para incluir el comando en la transacción. New-Item MyCompany -UseTX Como la clave MyCompany ya existe en el Registro, se produce un error al ejecutar el comando 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: CAMBIAR LA PREFERENCIA DE REVERSIÓN Si desea que la transacción tenga más tolerancia a los errores, puede utilizar el parámetro RollbackPreference de Start-Transactio n para cambiar la preferencia. El comando siguiente inicia una transacción con la preferencia de reversión "Never". start-transaction -rollbackpreference Never En este caso, cuando se produce un error al ejecutar 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 sigue estando activa, se puede volver a enviar el comando como parte de la transacción. New-Item MyOtherCompany -UseTX EJEMPLO 7: USAR EL CMDLET USE-TRANSACTION El cmdlet Use-Transaction permite realizar scripting directo respecto a objetos de Microsoft .NET Framework habilitados para transacciones. Use-Transaction toma un bloque de script que sólo puede contener comandos y expresiones que usan objetos de .NET Framework habilitados para transacciones, como las instancias de la clase Microsoft.PowerShell.Commands.Management.TransactedString. El comando siguiente inicia una transacción. start-transaction El comando New-Object siguiente 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 se aplica inmediatamente. $t.append("Windows") El comando siguiente utiliza el mismo método Append para agregar texto, pero lo agrega como parte de la transacción. El comando se escribe 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 que admite transacciones en $t, utilice el método ToString del objeto TransactedString. $t.tostring() El resultado muestra que sólo se aplican los cambios que no admiten transacciones. Windows Para ver el contenido actual de la cadena que admite transacciones en $t desde la transacción, incruste la expresión en un comando Use-Transaction. use-transaction {$s.tostring()} -usetx El resultado muestra la vista de la transacción. Windows PowerShell El comando siguiente confirma la transacción. complete-transaction Para ver la cadena final: $t.tostring() Windows PowerShell EJEMPLO 7: ADMINISTRAR TRANSACCIONES CON VARIOS SUSCRIPTORES Cuando se inicia una transacción mientras otra está en curso, Windows 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 se ve y se administra una transacción con varios suscriptores. Comience iniciando una transacción en la clave HKCU:\Software. start-transaction El comando siguiente 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 comando siguiente agrega la clave MyCompany al Registro. Utiliza el parámetro UseTransaction para incluir el comando en la transacción. new-item MyCompany -UseTransaction El comando siguiente utiliza el comando Start-Transaction para iniciar una transacción. Aunque este comando se escribe en el símbolo del sistema, este escenario es más probable que se produzca al ejecutar 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 2 ahora. RollbackPreference SubscriberCount Status ------------------ --------------- ------ Error 2 Active El comando siguiente utiliza el cmdlet New-ItemProperty para agregar la entrada del Registro MyKey a la clave MyCompany. Utiliza 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 comando siguiente confirma la transacción. Si revirtiese la transacción, esta 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 finalizar la transacción confirmándola, escriba un segundo comando Complete- Transaction. Para confirmar una transacción con varios suscriptores, debe escribir 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: ADMINISTRAR TRANSACCIONES INDEPENDIENTES Cuando se inicia una transacción mientras otra está en curso, se puede utilizar el parámetro Independent de Start-Transaction para que la nueva transacción sea independiente de la transacción original. Al realizar esta acción, 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 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 comando siguiente 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. Utiliza el parámetro Independent para indicar que esta transacción no es un suscriptor para la transacción activa. start-transaction -independent Cuando se crea una transacción independiente, la nueva transacción (última transacción creada) se convierte en la transacción activa. Puede usar un comando Get-Transaction para obtener la transacción activa. get-transaction Observe que el valor de SubscriberCount en la transacción es 1, lo que significa que no hay otros suscriptores y que la transacción es nueva. RollbackPreference SubscriberCount Status ------------------ --------------- ------ Error 1 Active La nueva transacción se debe finalizar (confirmándola o revirtiéndola) antes de poder administrar la transacción original. El comando siguiente 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, revierta la transacción. Si hubiera una única transacción con dos suscriptores, la reversión de la transacción supondría la reversión de la transacción completa para todos los suscriptores. Sin embargo, como estas transacciones son independientes, la reversión de la transacción más reciente cancela los cambios del Registro y convierte la transacción original en la transacción activa. undo-transaction Un comando Get-Transaction confirma que la transacción original sigue estando activa en la sesión. get-transaction RollbackPreference SubscriberCount Status ------------------ --------------- ------ Error 1 Active El comando siguiente 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 Nombre Propiedad --- -- ---- -------- 83 1 Microsoft {(Valor predeterminado)} 0 0 MyCompany {} VEA TAMBIÉN Start-Transaction Get-Transaction Complete-Transaction Undo-Transaction Use-Transaction Registro (proveedor) about_Providers Get-PSProvider Get-ChildItem