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
ochNever
. Standardvärdet ärError
.Status: Innehåller den aktuella statusen för transaktionen. Giltiga värden är
Active
,Committed
ochRolledBack
.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 $t
anvä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 {}