Partager via


À propos des transactions

DESCRIPTION COURTE

Décrit comment gérer les opérations traitées dans PowerShell.

DESCRIPTION DÉTAILLÉE

Les transactions sont prises en charge dans PowerShell à partir de PowerShell 2.0. Cette fonctionnalité vous permet de démarrer une transaction, d’indiquer quelles commandes font partie de la transaction et de valider ou restaurer une transaction.

À PROPOS DES TRANSACTIONS

Dans PowerShell, une transaction est un ensemble d’une ou plusieurs commandes gérées en tant qu’unité logique. Une transaction peut être terminée (« validée »), ce qui modifie les données affectées par la transaction. Une transaction peut également être complètement annulée (« annulée ») afin que les données affectées ne soient pas modifiées par la transaction.

Étant donné que les commandes d’une transaction sont gérées en tant qu’unité, toutes les commandes sont validées ou toutes les commandes sont restaurées.

Les transactions sont largement utilisées dans le traitement des données, notamment dans les opérations de base de données et pour les transactions financières. Les transactions sont le plus souvent utilisées lorsque le pire scénario pour un ensemble de commandes n’est pas qu’elles échouent toutes, mais que certaines commandes réussissent tandis que d’autres échouent, laissant le système dans un état endommagé, faux ou ininterprétable difficile à réparer.

APPLETS DE COMMANDE DE TRANSACTION

PowerShell inclut plusieurs applets de commande conçues pour la gestion des transactions.

  • Start-Transaction : Démarre une nouvelle transaction.
  • Use-Transaction : ajoute une commande ou une expression à la transaction. La commande doit utiliser des objets compatibles avec les transactions.
  • Annuler la transaction : annule la transaction afin qu’aucune donnée ne soit modifiée par la transaction.
  • Complete-Transaction : valide la transaction. Les données affectées par la transaction sont modifiées.
  • Get-Transaction : Obtient des informations sur la transaction active.

Pour obtenir la liste des applets de commande de transaction, tapez :

get-command *transaction

Pour plus d’informations sur les applets de commande, tapez :

get-help use-transaction -detailed

TRANSACTION-ENABLED ÉLÉMENTS

Pour participer à une transaction, l’applet de commande et le fournisseur doivent prendre en charge les transactions. Cette fonctionnalité est intégrée aux objets affectés par la transaction.

Le fournisseur de registre PowerShell prend en charge les transactions dans Windows Vista. L’objet TransactedString (Microsoft.PowerShell.Commands.Management.TransactedString) fonctionne avec n’importe quel système d’exploitation qui exécute PowerShell.

D’autres fournisseurs PowerShell peuvent prendre en charge les transactions. Pour trouver les fournisseurs PowerShell de votre session qui prennent en charge les transactions, utilisez la commande suivante pour trouver la valeur « Transactions » dans la propriété Capabilities des fournisseurs :

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

Pour plus d’informations sur un fournisseur, consultez l’aide du fournisseur. Pour obtenir de l’aide du fournisseur, tapez :

get-help <provider-name>

Par exemple, pour obtenir de l’aide sur le fournisseur de Registre, tapez :

get-help registry

LE PARAMÈTRE USETRANSACTION

Les applets de commande qui peuvent prendre en charge les transactions ont un paramètre UseTransaction. Ce paramètre inclut la commande dans la transaction active. Vous pouvez utiliser le nom complet du paramètre ou son alias, « usetx ».

Le paramètre ne peut être utilisé que lorsque la session contient une transaction active. Si vous entrez une commande avec le paramètre UseTransaction alors qu’il n’y a pas de transaction active, la commande échoue.

Pour rechercher des applets de commande à l’aide du paramètre UseTransaction, tapez :

get-help * -parameter UseTransaction

Dans PowerShell Core, toutes les applets de commande conçues pour fonctionner avec les fournisseurs PowerShell prennent en charge les transactions. Par conséquent, vous pouvez utiliser les applets de commande du fournisseur pour gérer les transactions.

Pour plus d’informations sur les fournisseurs PowerShell, consultez about_Providers.

L’OBJET DE LA TRANSACTION

Les transactions sont représentées dans PowerShell par un objet de transaction, System.Management.Automation.Transaction.

L’objet dispose des propriétés suivantes :

  • RollbackPreference : Contient la préférence de restauration définie pour la transaction en cours. Vous pouvez définir la préférence de restauration lorsque vous utilisez Start-Transaction pour démarrer la transaction.

    La préférence de restauration détermine les conditions dans lesquelles la transaction est restaurée automatiquement. Les valeurs valides sont Error, TerminatingError et Never. La valeur par défaut est Error.

  • Statut : Contient le statut actuel de la transaction. Les valeurs valides sont Active, Committed et RolledBack.

  • SubscriberCount : Contient le nombre d’abonnés à la transaction. Un abonné est ajouté à une transaction lorsque vous démarrez une transaction pendant qu’une autre transaction est en cours. Le nombre d’abonnés est décrémenté lorsqu’un abonné valide la transaction.

TRANSACTIONS ACTIVES

Dans PowerShell, une seule transaction est active à la fois et vous pouvez gérer uniquement la transaction active. Plusieurs transactions peuvent être en cours dans la même session en même temps, mais seules les transactions démarrées le plus récemment sont actives.

Par conséquent, vous ne pouvez pas spécifier une transaction particulière lors de l’utilisation des applets de commande de transaction. Les commandes s’appliquent toujours à la transaction active.

Cela est particulièrement évident dans le comportement de l’applet de commande Get-Transaction. Lorsque vous entrez une commande Get-Transaction, Get-Transaction n’obtient toujours qu’un seul objet de transaction. Cet objet est l’objet qui représente la transaction active.

Pour gérer une autre transaction, vous devez d’abord terminer la transaction active, soit en la commitant, soit en la réamettant. Lorsque vous effectuez cette opération, la transaction précédente devient active automatiquement. Les transactions deviennent actives dans l’ordre inverse de celui dans lequel elles sont démarrées, de sorte que la dernière transaction démarrée est toujours active.

ABONNÉS ET TRANSACTIONS INDÉPENDANTES

Si vous démarrez une transaction alors qu’une autre transaction est en cours, par défaut, PowerShell ne démarre pas une nouvelle transaction. Au lieu de cela, il ajoute un « abonné » à la transaction actuelle.

Lorsqu’une transaction a plusieurs abonnés, une seule commande Undo-Transaction à tout moment annule l’intégralité de la transaction pour tous les abonnés. Toutefois, pour valider la transaction, vous devez entrer une commande Complete-Transaction pour chaque abonné.

Pour rechercher le nombre d’abonnés à une transaction, vérifiez la propriété SubscriberCount de l’objet de transaction. Par exemple, la commande suivante utilise l’applet de commande Get-Transaction pour obtenir la valeur de la propriété SubscriberCount de la transaction active :

(Get-Transaction).SubscriberCount

L’ajout d’un abonné est le comportement par défaut, car la plupart des transactions démarrées pendant qu’une autre transaction est en cours sont liées à la transaction d’origine. Dans le modèle classique, un script qui contient une transaction appelle un script d’assistance qui contient sa propre transaction. Étant donné que les transactions sont liées, elles doivent être restaurées ou validées en tant qu’unité.

Toutefois, vous pouvez démarrer une transaction indépendante de la transaction en cours à l’aide du paramètre Independent de l’applet de commande Start-Transaction.

Lorsque vous démarrez une transaction indépendante, Start-Transaction crée un nouvel objet de transaction et la nouvelle transaction devient la transaction active. La transaction indépendante peut être validée ou restaurée sans affecter la transaction d’origine.

Lorsque la transaction indépendante est terminée (validée ou restaurée), la transaction d’origine devient à nouveau la transaction active.

MODIFICATION DES DONNÉES

Lorsque vous utilisez des transactions pour modifier des données, les données affectées par la transaction ne sont pas modifiées tant que vous n’avez pas validé la transaction. Cependant, les mêmes données peuvent être modifiées par des commandes qui ne font pas partie de la transaction.

Gardez à l’esprit que lorsque vous utilisez des transactions pour gérer les données partagées. En règle générale, les bases de données ont des mécanismes qui verrouillent les données pendant que vous travaillez dessus, empêchent d’autres utilisateurs et d’autres commandes, scripts et fonctions, de les modifier.

Toutefois, le verrou est une fonctionnalité de la base de données. Il n’est pas lié aux transactions. Si vous travaillez dans un système de fichiers compatible avec la transaction ou dans un autre magasin de données, les données peuvent être modifiées pendant que la transaction est en cours.

EXEMPLES

Les exemples de cette section utilisent le fournisseur de Registre PowerShell et supposent que vous êtes familiarisé avec celui-ci. Pour plus d’informations sur le fournisseur de registre, tapez « get-help registry ».

EXEMPLE 1 : VALIDATION D’UNE TRANSACTION

Pour créer une transaction, utilisez l’applet de commande Start-Transaction. La commande suivante démarre une transaction avec les paramètres par défaut.

start-transaction

Pour inclure des commandes dans la transaction, utilisez le paramètre UseTransaction de l’applet de commande. Par défaut, les commandes ne sont pas incluses dans la transaction,

Par exemple, la commande suivante, qui définit l’emplacement actuel dans la clé logicielle du lecteur HKCU :, n’est pas incluse dans la transaction.

cd hkcu:\Software

La commande suivante, qui crée la clé MyCompany, utilise le paramètre UseTransaction de l’applet de commande New-Item pour inclure la commande dans la transaction active.

new-item MyCompany -UseTransaction

La commande retourne un objet qui représente la nouvelle clé, mais comme la commande fait partie de la transaction, le registre n’est pas encore modifié.

Hive: HKEY_CURRENT_USER\Software

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

Pour valider la transaction, utilisez l’applet de commande Complete-Transaction. Étant donné qu’il affecte toujours la transaction active, vous ne pouvez pas spécifier la transaction.

complete-transaction

En conséquence, la clé MyCompany est ajoutée au registre.

dir m*
Hive: HKEY_CURRENT_USER\software

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

EXEMPLE 2 : ANNULATION D’UNE TRANSACTION

Pour créer une transaction, utilisez l’applet de commande Start-Transaction. La commande suivante démarre une transaction avec les paramètres par défaut.

start-transaction

La commande suivante, qui crée la clé MyOtherCompany, utilise le paramètre UseTransaction de l’applet de commande New-Item pour inclure la commande dans la transaction active.

new-item MyOtherCompany -UseTransaction

La commande retourne un objet qui représente la nouvelle clé, mais comme la commande fait partie de la transaction, le registre n’est pas encore modifié.

Hive: HKEY_CURRENT_USER\Software

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

Pour annuler la transaction, utilisez l’applet de commande Undo-Transaction. Étant donné qu’il affecte toujours la transaction active, vous ne spécifiez pas la transaction.

Undo-transaction

Le résultat est que la clé MyOtherCompany n’est pas ajoutée au registre.

dir m*
Hive: HKEY_CURRENT_USER\software

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

EXEMPLE 3 : PRÉVISUALISATION D’UNE TRANSACTION

En règle générale, les commandes utilisées dans une transaction changent de données. Toutefois, les commandes qui obtiennent des données sont utiles dans une transaction, aussi, car elles obtiennent des données à l’intérieur de la transaction. Cela fournit un aperçu des modifications qui valident la transaction provoquerait.

L’exemple suivant montre comment utiliser la commande Get-ChildItem (l’alias est « dir ») pour prévisualiser les modifications apportées à une transaction.

La commande suivante démarre une transaction.

start-transaction

La commande suivante utilise l’applet de commande New-ItemProperty pour ajouter l’entrée de registre MyKey à la clé MyCompany. La commande utilise le paramètre UseTransaction pour inclure la commande dans la transaction.

new-itemproperty -path MyCompany -Name MyKey -value 123 -UseTransaction

La commande renvoie un objet représentant la nouvelle entrée de registre, mais l’entrée de registre n’est pas modifiée.

MyKey
-----
123

Pour obtenir les éléments qui se trouvent actuellement dans le registre, utilisez une commande Get-ChildItem (« dir ») sans le paramètre UseTransaction. La commande suivante obtient les éléments qui commencent par « M ».

dir m*

Le résultat montre qu’aucune entrée n’a encore été ajoutée à la clé MyCompany.

Hive: HKEY_CURRENT_USER\Software

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

Pour prévisualiser l’effet de la validation de la transaction, entrez une commande Get-ChildItem (« dir ») avec le paramètre UseTransaction. Cette commande a une vue des données à partir de la transaction.

dir m* -useTransaction

Le résultat indique que, si la transaction est validée, l’entrée MyKey sera ajoutée à la clé MyCompany.

Hive: HKEY_CURRENT_USER\Software

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

EXEMPLE 4 : COMBINER DES COMMANDES TRANSACTED ET NON-TRANSACTED

Vous pouvez entrer des commandes non traitées pendant une transaction. Les commandes non exécutées affectent immédiatement les données, mais elles n’affectent pas la transaction. La commande suivante démarre une transaction dans la clé de registre HKCU :\Software.

start-transaction

Les trois commandes suivantes utilisent l’applet de commande New-Item pour ajouter des clés au registre. Les premières et troisième commandes utilisent le paramètre UseTransaction pour inclure les commandes dans la transaction. La deuxième commande omet le paramètre. Étant donné que la deuxième commande n’est pas incluse dans la transaction, elle prend effet immédiatement.

new-item MyCompany1 -UseTransaction
new-item MyCompany2
new-item MyCompany3 -UseTransaction

Pour afficher l’état actuel du registre, utilisez une commande Get-ChildItem (« dr ») sans le paramètre UseTransaction. Cette commande permet d’obtenir les éléments qui commencent par « M ».

dir m*

Le résultat montre que la clé MyCompany2 est ajoutée au registre, mais que les clés MyCompany1 et MyCompany3, qui font partie de la transaction, ne sont pas ajoutées.

Hive: HKEY_CURRENT_USER\Software

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

La commande suivante valide la transaction.

complete-transaction

À présent, les clés qui ont été ajoutées dans le cadre de la transaction apparaissent dans le Registre.

dir m*
Hive: HKEY_CURRENT_USER\Software

SKC  VC Name                           Property
---  -- ----                           --------
83   1 Microsoft                      {(default)}
0    0 MyCompany1                     {}
0    0 MyCompany2                     {}
0    0 MyCompany3                     {}

EXEMPLE 5 : UTILISATION DE LA RESTAURATION AUTOMATIQUE

Lorsqu’une commande dans une transaction génère une erreur de tout type, la transaction est automatiquement restaurée.

Ce comportement par défaut est conçu pour les scripts qui exécutent des transactions. Les scripts sont généralement bien testés et incluent une logique de gestion des erreurs, de sorte que les erreurs ne sont pas attendues et doivent mettre fin à la transaction.

La première commande démarre une transaction dans la clé de registre HKCU :\Software.

start-transaction

La commande suivante utilise l’applet de commande New-Item pour ajouter la clé MyCompany au registre. La commande utilise le paramètre UseTransaction (l’alias est « usetx ») pour inclure la commande dans la transaction.

New-Item MyCompany -UseTX

Étant donné que la clé MyCompany existe déjà dans le registre, la commande échoue et la transaction est annulée.

New-Item : A key at this path already exists
At line:1 char:9
+ new-item <<<<  MyCompany -usetx

Une commande Get-Transaction confirme que la transaction a été annulée et que SubscriberCount est égal à 0.

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

EXEMPLE 6 : MODIFICATION DE LA PRÉFÉRENCE DE RESTAURATION

Si vous souhaitez que la transaction soit plus tolérante aux erreurs, vous pouvez utiliser le paramètre RollbackPreference de Start-Transaction pour modifier la préférence.

La commande suivante démarre une transaction avec une préférence de restauration « Jamais ».

start-transaction -rollbackpreference Never

Dans ce cas, en cas d’échec de la commande, la transaction n’est pas automatiquement annulée.

New-Item MyCompany -UseTX
New-Item : A key at this path already exists
At line:1 char:9
+ new-item <<<<  MyCompany -usetx

Étant donné que la transaction est toujours active, vous pouvez renvoyer la commande dans le cadre de la transaction.

New-Item MyOtherCompany -UseTX

EXEMPLE 7 : UTILISATION DE L’APPLET DE COMMANDE USE-TRANSACTION

L’applet de commande Use-Transaction vous permet d’exécuter des scripts directs sur des objets Microsoft .NET Framework transactionnels. Use-Transaction prend un bloc de script qui ne peut contenir que des commandes et des expressions qui utilisent des objets .NET Framework activés pour les transactions, tels que des instances de la classe Microsoft.PowerShell.Commands.Management.TransactedString.

La commande suivante démarre une transaction.

start-transaction

La commande New-Object suivante crée une instance de la classe TransactedString et l’enregistre dans la variable $t.

$t = New-Object Microsoft.PowerShell.Commands.Management.TransactedString

La commande suivante utilise la méthode Append de l’objet TransactedString pour ajouter du texte à la chaîne. Étant donné que la commande ne fait pas partie de la transaction, la modification prend effet immédiatement.

$t.append("Windows")

La commande suivante utilise la même méthode Append pour ajouter du texte, mais elle ajoute le texte dans le cadre de la transaction. La commande est placée entre accolades et est définie comme la valeur du paramètre ScriptBlock de Use-Transaction. Le paramètre UseTransaction (UseTx) est obligatoire.

use-transaction {$t.append(" PowerShell")} -usetx

Pour afficher le contenu actuel de la chaîne transactée dans $t, utilisez la méthode ToString de l’objet TransactedString.

$t.tostring()

La sortie indique que seules les modifications non traitées sont effectives.

Windows

Pour afficher le contenu actuel de la chaîne transigée en $t à partir de la transaction, intégrez l’expression dans une commande Use-Transaction.

use-transaction {$s.tostring()} -usetx

La sortie affiche la vue transactionnelle.

PowerShell

La commande suivante valide la transaction.

complete-transaction

Pour afficher la chaîne finale :

$t.tostring()
PowerShell

EXEMPLE 8 : GESTION MULTI-SUBSCRIBER TRANSACTIONS

Lorsque vous démarrez une transaction alors qu’une autre transaction est en cours, PowerShell ne crée pas de deuxième transaction par défaut. Au lieu de cela, il ajoute un abonné à la transaction actuelle.

Cet exemple montre comment afficher et gérer une transaction multi-abonné.

Commencez par démarrer une transaction dans la clé HKCU :\Software.

start-transaction

La commande suivante utilise la commande Get-Transaction pour obtenir la transaction active.

get-transaction

Le résultat montre l’objet qui représente la transaction active.

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

La commande suivante ajoute la clé MyCompany au Registre. La commande utilise le paramètre UseTransaction pour inclure la commande dans la transaction.

new-item MyCompany -UseTransaction

La commande suivante utilise la commande Start-Transaction pour démarrer une transaction. Bien que cette commande soit tapée à l’invite de commandes, ce scénario est plus susceptible de se produire lorsque vous exécutez un script qui contient une transaction.

start-transaction

Une commande Get-Transaction indique que le nombre d’abonnés sur l’objet de transaction est incrémenté. La valeur est maintenant 2.

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

La commande suivante utilise l’applet de commande New-ItemProperty pour ajouter l’entrée de registre MyKey à la clé MyCompany. Il utilise le paramètre UseTransaction pour inclure la commande dans la transaction.

new-itemproperty -path MyCompany -name MyKey -UseTransaction

La clé MyCompany n’existe pas dans le registre, mais cette commande réussit car les deux commandes font partie de la même transaction.

La commande suivante valide la transaction. S’il a restauré la transaction, la transaction est restaurée pour tous les abonnés.

complete-transaction

Une commande Get-Transaction indique que le nombre d’abonnés sur l’objet de transaction est de 1, mais que la valeur de Status est toujours Active (not Committed).

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

Pour terminer la validation de la transaction, entrez une deuxième commande Complete- Transaction. Pour valider une transaction multi-abonnés, vous devez entrer une commande Complete-Transaction pour chaque commande Start-Transaction.

complete-transaction

Une autre commande Get-Transaction indique que la transaction a été validée.

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

EXEMPLE 9 : GESTION D’OPÉRATIONS INDÉPENDANTES

Lorsque vous démarrez une transaction alors qu’une autre transaction est en cours, vous pouvez utiliser le paramètre Indépendant de Start-Transaction pour rendre la nouvelle transaction indépendante de la transaction d’origine.

Lorsque vous le faites, Start-Transaction crée un nouvel objet de transaction et fait de la nouvelle transaction la transaction active.

Commencez par démarrer une transaction dans la clé HKCU :\Software.

start-transaction

La commande suivante utilise la commande Get-Transaction pour obtenir la transaction active.

get-transaction

Le résultat montre l’objet qui représente la transaction active.

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

La commande suivante ajoute la clé de Registre MyCompany dans le cadre de la transaction. Il utilise le paramètre UseTransaction (UseTx) pour inclure la commande dans la transaction active.

new-item MyCompany -use

La commande suivante démarre une nouvelle transaction. La commande utilise le paramètre Independent pour indiquer que cette transaction n’est pas abonnée à la transaction active.

start-transaction -independent

Lorsque vous créez une transaction indépendante, la nouvelle transaction (la plus récente) devient la transaction active. Vous pouvez utiliser une commande Get-Transaction pour obtenir la transaction active.

get-transaction

Notez que l’AbonnéCount de la transaction est 1, indiquant qu’il n’y a pas d’autres abonnés et que la transaction est nouvelle.

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

La nouvelle transaction doit être terminée (validée ou restaurée) avant de pouvoir gérer la transaction d’origine.

La commande suivante ajoute la clé MyOtherCompany au registre. Il utilise le paramètre UseTransaction (UseTx) pour inclure la commande dans la transaction active.

new-item MyOtherCompany -usetx

Maintenant, restaurez la transaction. S’il y avait une seule transaction avec deux abonnés, la restauration de la transaction annulerait toute la transaction pour tous les abonnés.

Toutefois, étant donné que ces transactions sont indépendantes, la restauration de la transaction la plus récente annule les modifications du Registre et rend la transaction d’origine la transaction active.

undo-transaction

Une commande Get-Transaction confirme que la transaction d’origine est toujours active dans la session.

get-transaction
RollbackPreference   SubscriberCount   Status
------------------   ---------------   ------
Error                1                 Active

La commande suivante valide la transaction active.

complete-transaction

Une commande Get-ChildItem indique que le registre a été modifié.

dir m*
Hive: HKEY_CURRENT_USER\Software

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

VOIR AUSSI

Start-Transaction

Get-Transaction

Transaction complète

Annuler la transaction

Utilisation-Transaction

Get-PSProvider

Get-ChildItem

about_Providers