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