about_Transactions

Kort beskrivning

Beskriver hur du hanterar transaktioner i PowerShell.

Lång beskrivning

Transaktioner stöds i PowerShell från och med PowerShell 2.0. Med den här funktionen kan du starta en transaktion, ange vilka kommandon som ingår i transaktionen och checka in eller återställa en transaktion.

I PowerShell är en transaktion en uppsättning med ett eller flera kommandon som hanteras som en logisk enhet. En transaktion kan slutföras ("committed"), vilket ändrar data som påverkas av transaktionen. En transaktion kan också ångras helt ("återställd") så att de berörda data inte ändras av transaktionen.

Eftersom kommandona i en transaktion hanteras som en enhet checkas antingen alla kommandon in eller så återställs alla kommandon.

Transaktioner används ofta vid databehandling, framför allt i databasåtgärder och för finansiella transaktioner. Transaktioner används oftast när det värsta scenariot för en uppsättning kommandon inte är att alla misslyckas, utan att vissa kommandon lyckas medan andra misslyckas, vilket gör att systemet är skadat, falskt eller inte kan tolkas som svårt att reparera.

Transaktions-cmdletar

PowerShell innehåller flera cmdletar som är utformade för att hantera transaktioner.

  • Start-Transaction: Startar en ny transaktion.
  • Use-Transaction: Lägger till ett kommando eller uttryck i transaktionen. Kommandot måste använda transaktionsaktiverade objekt.
  • Undo-Transaction: Återställer transaktionen så att inga data ändras av transaktionen.
  • Complete-Transaction: Genomför transaktionen. De data som påverkas av transaktionen ändras.
  • Get-Transaction: Hämtar information om den aktiva transaktionen.

För en lista över transaktions-cmdletar skriver du:

Get-Command *transaction

Om du vill ha detaljerad information om cmdletarna skriver du:

Get-Help Use-Transaction -Detailed

Transaktionsaktiverade element

För att kunna delta i en transaktion måste både cmdleten och providern ha stöd för transaktioner. Den här funktionen är inbyggd i de objekt som påverkas av transaktionen.

PowerShell-registerprovidern stöder transaktioner i Windows. TransactedString-objektet fungerar med alla operativsystem som kör PowerShell.

Andra PowerShell-leverantörer kan stödja transaktioner. Om du vill hitta PowerShell-leverantörerna i din session som stöder transaktioner använder du följande kommando för att hitta värdet Transaktioner i egenskapen Funktioner för leverantörer:

Get-PSProvider | Where-Object {$_.Capabilities -like "*transactions*"}

Mer information om en provider finns i Hjälp för providern. Om du vill få providerhjälp skriver du:

Get-Help <provider-name>

Om du till exempel vill få hjälp för registerprovidern skriver du:

Get-Help registry

Parametern UseTransaction

Cmdletar som kan stödja transaktioner har en UseTransaction-parameter . Den här parametern innehåller kommandot i den aktiva transaktionen. Du kan använda det fullständiga parameternamnet eller dess alias, usetx.

Parametern kan endast användas när sessionen innehåller en aktiv transaktion. Om du anger ett kommando med parametern UseTransaction när det inte finns någon aktiv transaktion misslyckas kommandot.

Om du vill hitta cmdletar med parametern UseTransaction skriver du:

Get-Help * -Parameter UseTransaction

I PowerShell Core stöder alla cmdletar som är utformade för att fungera med PowerShell-leverantörer transaktioner. Därför kan du använda provider-cmdletarna för att hantera transaktioner.

Mer information om PowerShell-leverantörer finns i about_Providers.

Transaktionsobjektet

Transaktioner representeras i PowerShell av ett transaktionsobjekt, System.Management.Automation.Transaction.

Objektet har följande egenskaper:

  • RollbackPreference: Innehåller inställningen för återställning för den aktuella transaktionen. Du kan ange återställningsinställningen när du använder Start-Transaction för att starta transaktionen.

    Återställningsinställningen avgör under vilka förhållanden transaktionen återställs automatiskt. Giltiga värden är Error, TerminatingError och Never. Standardvärdet är Error.

  • Status: Innehåller den aktuella statusen för transaktionen. Giltiga värden är Active, Committed och RolledBack.

  • SubscriberCount: Innehåller antalet prenumeranter för transaktionen. En prenumerant läggs till i en transaktion när du startar en transaktion medan en annan transaktion pågår. Antalet prenumeranter minskas när en prenumerant genomför transaktionen.

Aktiva transaktioner

I PowerShell är endast en transaktion aktiv i taget och du kan bara hantera den aktiva transaktionen. Flera transaktioner kan pågår i samma session samtidigt, men endast den senast startade transaktionen är aktiv.

Därför kan du inte ange en viss transaktion när du använder transaktions-cmdletarna. Kommandon gäller alltid för den aktiva transaktionen.

Detta är tydligast i cmdletens Get-Transaction beteende. När du anger ett Get-Transaction kommando Get-Transaction hämtar alltid bara ett transaktionsobjekt. Det här objektet är det objekt som representerar den aktiva transaktionen.

Om du vill hantera en annan transaktion måste du först slutföra den aktiva transaktionen, antingen genom att checka in den eller återställa den. När du gör detta aktiveras den tidigare transaktionen automatiskt. Transaktioner blir aktiva i omvänd ordning som de startas, så att den senast startade transaktionen alltid är aktiv.

Prenumeranter och oberoende transaktioner

Om du startar en transaktion medan en annan transaktion pågår startar PowerShell som standard inte en ny transaktion. I stället läggs en "prenumerant" till den aktuella transaktionen.

När en transaktion har flera prenumeranter återställer ett enda Undo-Transaction kommando när som helst hela transaktionen för alla prenumeranter. Men för att genomföra transaktionen måste du ange ett Complete-Transaction kommando för varje prenumerant.

Om du vill hitta antalet prenumeranter för en transaktion kontrollerar du egenskapen SubscriberCount för transaktionsobjektet. Följande kommando använder till exempel cmdleten Get-Transaction för att hämta värdet för egenskapen SubscriberCount för den aktiva transaktionen:

(Get-Transaction).SubscriberCount

Att lägga till en prenumerant är standardbeteendet eftersom de flesta transaktioner som startas medan en annan transaktion pågår är relaterade till den ursprungliga transaktionen. I den typiska modellen anropar ett skript som innehåller en transaktion ett hjälpskript som innehåller en egen transaktion. Eftersom transaktionerna är relaterade bör de återställas eller checkas in som en enhet.

Du kan dock starta en transaktion som är oberoende av den aktuella transaktionen med hjälp av den oberoende parametern för cmdleten Start-Transaction .

När du startar en oberoende transaktion Start-Transaction skapar du ett nytt transaktionsobjekt och den nya transaktionen blir den aktiva transaktionen. Den oberoende transaktionen kan checkas in eller återställas utan att den ursprungliga transaktionen påverkas.

När den oberoende transaktionen har slutförts (checkats in eller återställts) blir den ursprungliga transaktionen den aktiva transaktionen igen.

Ändra data

När du använder transaktioner för att ändra data ändras inte de data som påverkas av transaktionen förrän du checkar in transaktionen. Samma data kan dock ändras med kommandon som inte ingår i transaktionen.

Tänk på detta när du använder transaktioner för att hantera delade data. Vanligtvis har databaser mekanismer som låser data medan du arbetar med dem, vilket hindrar andra användare och andra kommandon, skript och funktioner från att ändra dem.

Låset är dock en funktion i databasen. Det är inte relaterat till transaktioner. Om du arbetar i ett transaktionsaktiverat filsystem eller ett annat datalager kan data ändras medan transaktionen pågår.

Exempel

Exemplen i det här avsnittet använder PowerShell Registry-providern och förutsätter att du är bekant med den. Om du vill ha information om registerprovidern skriver du Get-Help registry.

Exempel 1: Genomföra en transaktion

Om du vill skapa en transaktion använder du cmdleten Start-Transaction . Följande kommando startar en transaktion med standardinställningarna.

Start-Transaction

Om du vill inkludera kommandon i transaktionen använder du parametern UseTransaction för cmdleten. Som standard ingår inte kommandon i transaktionen.

Följande kommando, som anger den aktuella platsen i enhetens programvarunyckel HKCU: , ingår till exempel inte i transaktionen.

cd hkcu:\Software

Följande kommando, som skapar mycompany-nyckeln, använder parametern UseTransaction för cmdleten New-Item för att inkludera kommandot i den aktiva transaktionen.

New-Item MyCompany -UseTransaction

Kommandot returnerar ett objekt som representerar den nya nyckeln, men eftersom kommandot är en del av transaktionen har registret ännu inte ändrats.

Hive: HKEY_CURRENT_USER\Software

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

Använd cmdleten för att checka Complete-Transaction in transaktionen. Eftersom det alltid påverkar den aktiva transaktionen kan du inte ange transaktionen.

Complete-Transaction

Därför MyCompany läggs nyckeln till i registret.

dir m*
Hive: HKEY_CURRENT_USER\software

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

Exempel 2: Återställa en transaktion

Om du vill skapa en transaktion använder du cmdleten Start-Transaction . Följande kommando startar en transaktion med standardinställningarna.

Start-Transaction

Följande kommando, som skapar nyckeln MyOtherCompany, använder parametern UseTransaction för cmdleten New-Item för att inkludera kommandot i den aktiva transaktionen.

New-Item MyOtherCompany -UseTransaction

Kommandot returnerar ett objekt som representerar den nya nyckeln, men eftersom kommandot är en del av transaktionen har registret ännu inte ändrats.

Hive: HKEY_CURRENT_USER\Software

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

Om du vill återställa transaktionen använder du cmdleten Undo-Transaction . Eftersom det alltid påverkar den aktiva transaktionen anger du inte transaktionen.

Undo-Transaction

Resultatet är att MyOtherCompany nyckeln inte läggs till i registret.

dir m*
Hive: HKEY_CURRENT_USER\software

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

Exempel 3: Förhandsgranska en transaktion

Normalt ändrar kommandona som används i en transaktion data. Kommandona som hämtar data är dock också användbara i en transaktion eftersom de hämtar data i transaktionen. Detta ger en förhandsgranskning av de ändringar som transaktionen skulle orsaka.

I följande exempel visas hur du använder Get-ChildItem kommandot (aliaset är dir) för att förhandsgranska ändringarna i en transaktion.

Följande kommando startar en transaktion.

Start-Transaction

Följande kommando använder cmdleten New-ItemProperty för att lägga till MyKey registerposten i MyCompany-nyckeln. Kommandot använder parametern UseTransaction för att inkludera kommandot i transaktionen.

New-Itemproperty -path MyCompany -Name MyKey -value 123 -UseTransaction

Kommandot returnerar ett objekt som representerar den nya registerposten, men registerposten ändras inte.

MyKey
-----
123

Om du vill hämta de objekt som för närvarande finns i registret använder du ett Get-ChildItem kommando (dir) utan parametern UseTransaction. Följande kommando hämtar objekt som börjar med "M".

dir m*

Resultatet visar att inga poster ännu har lagts till i MyCompany nyckeln.

Hive: HKEY_CURRENT_USER\Software

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

Om du vill förhandsgranska effekten av att genomföra transaktionen anger du ett Get-ChildItem (dir) kommando med parametern UseTransaction. Det här kommandot har en vy över data från transaktionen.

dir m* -useTransaction

Resultatet visar att om transaktionen checkas in MyKey läggs posten till i MyCompany nyckeln.

Hive: HKEY_CURRENT_USER\Software

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

Exempel 4: Kombinera transacted och icke-transacted kommandon

Du kan ange icke-transacted-kommandon under en transaktion. De icke-transakterade kommandona påverkar data omedelbart, men de påverkar inte transaktionen. Följande kommando startar en transaktion i registernyckeln HKCU:\Software .

Start-Transaction

De följande tre kommandona använder cmdleten New-Item för att lägga till nycklar i registret. De första och tredje kommandona använder parametern UseTransaction för att inkludera kommandona i transaktionen. Det andra kommandot utelämnar parametern. Eftersom det andra kommandot inte ingår i transaktionen gäller det omedelbart.

New-Item MyCompany1 -UseTransaction
New-Item MyCompany2
New-Item MyCompany3 -UseTransaction

Om du vill visa registrets aktuella tillstånd använder du ett Get-ChildItem (dir) kommando utan parametern UseTransaction. Det här kommandot hämtar objekt som börjar med M.

dir m*

Resultatet visar att MyCompany2 nyckeln läggs till i registret, men MyCompany1 nycklarna och MyCompany3 , som ingår i transaktionen, läggs inte till.

Hive: HKEY_CURRENT_USER\Software

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

Följande kommando checkar in transaktionen.

Complete-Transaction

Nu visas nycklarna som lades till som en del av transaktionen i registret.

dir m*
Hive: HKEY_CURRENT_USER\Software

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

Exempel 5: Använda automatisk återställning

När ett kommando i en transaktion genererar ett fel av något slag återställs transaktionen automatiskt.

Det här standardbeteendet är utformat för skript som kör transaktioner. Skript testas vanligtvis väl och innehåller logik för felhantering, så fel förväntas inte och bör avsluta transaktionen.

Det första kommandot startar en transaktion i registernyckeln HKCU:\Software .

Start-Transaction

Följande kommando använder cmdleten New-Item för att lägga MyCompany till nyckeln i registret. Kommandot använder parametern UseTransaction (aliaset är usetx) för att inkludera kommandot i transaktionen.

New-Item MyCompany -usetx

MyCompany Eftersom nyckeln redan finns i registret misslyckas kommandot och transaktionen återställs.

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

Ett Get-Transaction kommando bekräftar att transaktionen har återställts och att SubscriberCount är 0.

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

Exempel 6: Ändra återställningsinställningen

Om du vill att transaktionen ska vara mer feltolerant kan du använda parametern Start-Transaction RollbackPreference för att ändra inställningen.

Följande kommando startar en transaktion med återställningsinställningen Never.

Start-Transaction -RollbackPreference Never

I det här fallet, när kommandot misslyckas, återställs inte transaktionen automatiskt.

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

Eftersom transaktionen fortfarande är aktiv kan du skicka kommandot igen som en del av transaktionen.

New-Item MyOtherCompany -usetx

Exempel 7: Använda cmdleten Use-Transaction

Med Use-Transaction cmdleten kan du utföra direktskript mot transaktionsaktiverade Microsoft .NET Framework-objekt. Use-Transaction tar ett skriptblock som bara kan innehålla kommandon och uttryck som använder transaktionsaktiverade .NET Framework-objekt, till exempel instanser av klassen Microsoft.PowerShell.Commands.Management.TransactedString .

Följande kommando startar en transaktion.

Start-Transaction

Följande New-Object kommando skapar en instans av klassen TransactedString och sparar den i variabeln $t .

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

Följande kommando använder append-metoden för TransactedString-objektet för att lägga till text i strängen. Eftersom kommandot inte är en del av transaktionen börjar ändringen gälla omedelbart.

$t.append("Windows")

Följande kommando använder samma tilläggsmetod för att lägga till text, men den lägger till texten som en del av transaktionen. Kommandot omges av klammerparenteser och anges som värdet för parametern ScriptBlock för Use-Transaction. Parametern UseTransaction (usetx) krävs.

Use-Transaction {$t.append(" PowerShell")} -usetx

Om du vill se det aktuella innehållet i den transacted strängen ToString i $tanvänder du metoden för TransactedString-objektet.

$t.tostring()

Utdata visar att endast de icke-transakterade ändringarna är effektiva.

Windows

Om du vill se det aktuella innehållet i den transagerade strängen i $t inifrån transaktionen bäddar du in uttrycket i ett Use-Transaction kommando.

Use-Transaction {$t.tostring()} -usetx

Utdata visar transaktionsvyn.

PowerShell

Följande kommando checkar in transaktionen.

Complete-Transaction

Så här ser du den sista strängen:

$t.tostring()
PowerShell

Exempel 8: Hantera transaktioner med flera prenumeranter

När du startar en transaktion medan en annan transaktion pågår skapar PowerShell inte en andra transaktion som standard. I stället läggs en prenumerant till i den aktuella transaktionen.

Det här exemplet visar hur du visar och hanterar en transaktion med flera prenumeranter.

Börja med att starta en transaktion i HKCU:\Software nyckeln.

Start-Transaction

Följande kommando använder Get-Transaction kommandot för att hämta den aktiva transaktionen.

Get-Transaction

Resultatet visar det objekt som representerar den aktiva transaktionen.

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

Följande kommando lägger till mycompany-nyckeln i registret. Kommandot använder parametern UseTransaction för att inkludera kommandot i transaktionen.

New-Item MyCompany -UseTransaction

Följande kommando använder Start-Transaction kommandot för att starta en transaktion. Även om det här kommandot skrivs i kommandotolken är det mer troligt att det här scenariot inträffar när du kör ett skript som innehåller en transaktion.

Start-Transaction

Ett Get-Transaction kommando visar att antalet prenumeranter på transaktionsobjektet ökar. Värdet är nu 2.

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

Nästa kommando använder cmdleten New-ItemProperty för att lägga till MyKey-registerposten i MyCompany-nyckeln. Den använder parametern UseTransaction för att inkludera kommandot i transaktionen.

New-ItemProperty -path MyCompany -name MyKey -UseTransaction

MyCompany-nyckeln finns inte i registret, men det här kommandot lyckas eftersom de två kommandona ingår i samma transaktion.

Följande kommando checkar in transaktionen. Om transaktionen återställdes återställs transaktionen för alla prenumeranter.

Complete-Transaction

Ett Get-Transaction kommando visar att prenumerantantalet för transaktionsobjektet är 1, men värdet för Status är fortfarande Aktivt (inte bekräftat).

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

Om du vill slutföra incheckningen av transaktionen anger du ett andra Complete- Transaction-kommando. Om du vill checka in en transaktion med flera prenumeranter måste du ange ett Complete-Transaction kommando för varje Start-Transaction kommando.

Complete-Transaction

Ett annat Get-Transaction kommando visar att transaktionen har checkats in.

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

Exempel 9: Hantera oberoende transaktioner

När du startar en transaktion medan en annan transaktion pågår kan du använda den oberoende parametern Start-Transaction för för att göra den nya transaktionen oberoende av den ursprungliga transaktionen.

När du gör det Start-Transaction skapar du ett nytt transaktionsobjekt och gör den nya transaktionen till den aktiva transaktionen.

Börja med att starta en transaktion i HKCU:\Software nyckeln.

Start-Transaction

Följande kommando använder Get-Transaction kommandot för att hämta den aktiva transaktionen.

Get-Transaction

Resultatet visar det objekt som representerar den aktiva transaktionen.

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

Följande kommando lägger till registernyckeln MyCompany som en del av transaktionen. Den använder parametern UseTransaction (usetx) för att inkludera kommandot i den aktiva transaktionen.

New-Item MyCompany -use

Följande kommando startar en ny transaktion. Kommandot använder den oberoende parametern för att indikera att den här transaktionen inte är prenumerant på den aktiva transaktionen.

Start-Transaction -Independent

När du skapar en oberoende transaktion blir den nya (senast skapade) transaktionen den aktiva transaktionen. Du kan använda ett Get-Transaction kommando för att hämta den aktiva transaktionen.

Get-Transaction

Observera att Prenumerantkontot för transaktionen är 1, vilket anger att det inte finns några andra prenumeranter och att transaktionen är ny.

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

Den nya transaktionen måste vara klar (antingen bekräftad eller återställd) innan du kan hantera den ursprungliga transaktionen.

Följande kommando lägger till nyckeln MyOtherCompany i registret. Den använder parametern UseTransaction (usetx) för att inkludera kommandot i den aktiva transaktionen.

New-Item MyOtherCompany -usetx

Återställ nu transaktionen. Om det fanns en enda transaktion med två prenumeranter skulle en återställning av transaktionen återställa hela transaktionen för alla prenumeranter.

Men eftersom dessa transaktioner är oberoende avbryter återställningen av den senaste transaktionen registerändringarna och gör den ursprungliga transaktionen till den aktiva transaktionen.

Undo-Transaction

Ett Get-Transaction kommando bekräftar att den ursprungliga transaktionen fortfarande är aktiv i sessionen.

Get-Transaction
RollbackPreference   SubscriberCount   Status
------------------   ---------------   ------
Error                1                 Active

Följande kommando checkar in den aktiva transaktionen.

Complete-Transaction

Ett Get-ChildItem kommando visar att registret har ändrats.

dir m*
Hive: HKEY_CURRENT_USER\Software

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

Se även