Om transaktioner
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.
OM TRANSAKTIONER
I PowerShell är en transaktion en uppsättning med ett eller flera kommandon som hanteras som en logisk enhet. En transaktion kan slutföras ("checkat"), vilket ändrar data som påverkas av transaktionen. Eller så kan en transaktion ångras helt ("återställd") så att 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 i databehandling, särskilt 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 lämnar systemet i ett skadat, falskt eller opretentabelt tillstånd som är svårt att reparera.
TRANSAKTIONS-CMDLETAR
PowerShell innehåller flera cmdletar som är utformade för att hantera transaktioner.
- Starttransaktion: Startar en ny transaktion.
- Use-Transaction: Lägger till ett kommando eller uttryck i transaktionen. Kommandot måste använda transaktionsaktiverade objekt.
- Ångra transaktion: Återställer transaktionen så att inga data ändras av transaktionen.
- Slutför transaktionen: Genomför transaktionen. De data som påverkas av transaktionen ändras.
- Get-Transaction: Hämtar information om den aktiva transaktionen.
Om du vill ha 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 Vista. TransactedString-objektet (Microsoft.PowerShell.Commands.Management.TransactedString) 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 providers:
get-psprovider | where {$_.Capabilities -like "transactions"}
Mer information om en provider finns i Hjälp för providern. Om du vill få leverantörshjä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ällningsuppsättningen 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 villkor transaktionen återställs automatiskt. Giltiga värden är Error, TerminatingError och Never. Standardvärdet är Fel.
Status: Innehåller den aktuella statusen för transaktionen. Giltiga värden är Active, Committed och RolledBack.
SubscriberCount: Innehåller antalet prenumeranter på 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 beteendet för Get-Transaction-cmdleten. När du anger ett Get-Transaction kommando hämtar Get-Transaction 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 blir den tidigare transaktionen aktiv automatiskt. Transaktioner blir aktiva i omvänd ordning, 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ägger den till en "prenumerant" i 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 på 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 skapar Start-Transaction 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. Databaser har vanligtvis 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-registerprovidern 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ÖR 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 programvarunyckeln för HKCU:-enheten, 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 ändras inte registret ännu.
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
0 0 MyCompany {}
Om du vill checka in transaktionen använder du cmdleten Complete-Transaction. Eftersom den alltid påverkar den aktiva transaktionen kan du inte ange transaktionen.
complete-transaction
Därför läggs mycompany-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 ändras inte registret ännu.
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 den alltid påverkar den aktiva transaktionen anger du inte transaktionen.
Undo-transaction
Resultatet är att nyckeln MyOtherCompany 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
Vanligtvis ä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 kommandot Get-ChildItem (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 registerposten MyKey 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 checka in transaktionen anger du ett Get-ChildItem-kommando ("dir") med parametern UseTransaction. Det här kommandot har en vy över data från transaktionen.
dir m* -useTransaction
Resultatet visar att mykey-posten läggs till i MyCompany-nyckeln om transaktionen checkas in.
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-transacted 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 kommandot Get-ChildItem ("dir") utan parametern UseTransaction. Det här kommandot hämtar objekt som börjar med "M".
dir m*
Resultatet visar att nyckeln MyCompany2 läggs till i registret, men nycklarna MyCompany1 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 genomför 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 felhanteringslogik, 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 till MyCompany-nyckeln i registret. Kommandot använder parametern UseTransaction (aliaset är "usetx") för att inkludera kommandot i transaktionen.
New-Item MyCompany -UseTX
Eftersom MyCompany-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 RollbackPreference för Start-Transaction för att ändra inställningen.
Följande kommando startar en transaktion med återställningsinställningen "Aldrig".
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 cmdleten Use-Transaction 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 ingår i 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 i $t använder du metoden ToString för TransactedString-objektet.
$t.tostring()
Utdata visar att endast de icke-transacted ändringarna är effektiva.
Windows
Om du vill se det aktuella innehållet i den transacted strängen i $t inifrån transaktionen bäddar du in uttrycket i ett Use-Transaction kommando.
use-transaction {$s.tostring()} -usetx
Utdata visar transaktionsvyn.
PowerShell
Följande kommando genomför 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 nyckeln HKCU:\Software.
start-transaction
Följande kommando använder kommandot Get-Transaction för att hämta den aktiva transaktionen.
get-transaction
Resultatet visar objektet 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 kommandot Start-Transaction 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 har ökat. 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 registerposten MyKey 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 genomför transaktionen. Om transaktionen återställdes skulle transaktionen återställas för alla prenumeranter.
complete-transaction
Ett Get-Transaction-kommando visar att antalet prenumeranter på 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 för Start-Transaction för att göra den nya transaktionen oberoende av den ursprungliga transaktionen.
När du gör det skapar Start-Transaction ett nytt transaktionsobjekt och gör den nya transaktionen till den aktiva transaktionen.
Börja med att starta en transaktion i nyckeln HKCU:\Software.
start-transaction
Följande kommando använder kommandot Get-Transaction för att hämta den aktiva transaktionen.
get-transaction
Resultatet visar objektet 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 parametern Independent 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 indikerar 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 checkas in eller återställas) 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 {}