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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de