about_Transactions
Krátký popis
Popisuje, jak spravovat transakce v PowerShellu.
Dlouhý popis
Transakce se podporují v PowerShellu počínaje PowerShellem 2.0. Tato funkce umožňuje spustit transakci, určit, které příkazy jsou součástí transakce, a potvrzení nebo vrácení transakce zpět.
V PowerShellu je transakce sada jednoho nebo více příkazů, které se spravují jako logická jednotka. Transakce může být dokončena ("potvrzeno"), které mění data ovlivněná transakcí. Nebo transakce může být zcela vrácena ("vrácena zpět"), aby ovlivněná data nebyla změněna transakcí.
Protože příkazy v transakci jsou spravovány jako jednotka, buď jsou potvrzeny všechny příkazy, nebo všechny příkazy jsou vráceny zpět.
Transakce se běžně používají při zpracování dat, zejména v databázových operacích a pro finanční transakce. Transakce se nejčastěji používají, když nejhorší scénář pro sadu příkazů není, že všechny selžou, ale že některé příkazy proběhnou úspěšně, zatímco jiné selžou, opouští systém v poškozeném, nepravdivém nebo neinterpretovatelném stavu, který je obtížné opravit.
Transakční rutiny
PowerShell obsahuje několik rutin navržených pro správu transakcí.
Start-Transaction
: Spustí novou transakci.Use-Transaction
: Přidá do transakce příkaz nebo výraz. Příkaz musí používat objekty s podporou transakcí.Undo-Transaction
: Vrátí transakce zpět tak, aby transakce nebyla změněna žádná data.Complete-Transaction
: Potvrdí transakci. Data ovlivněná transakcí se změní.Get-Transaction
: Získá informace o aktivní transakci.
Jako seznam rutin transakcí zadejte:
Get-Command *transaction
Podrobné informace o rutinách potřebujete zadáním:
Get-Help Use-Transaction -Detailed
Prvky s podporou transakcí
Chcete-li se účastnit transakce, musí rutina i poskytovatel podporovat transakce. Tato funkce je integrovaná do objektů, které jsou ovlivněny transakcí.
Poskytovatel registru PowerShellu podporuje transakce ve Windows. TransactedString objekt funguje s jakýmkoli operačním systémem, na kterém běží PowerShell.
Ostatní poskytovatelé PowerShellu můžou podporovat transakce. K vyhledání zprostředkovatelů PowerShellu ve vaší relaci, které podporují transakce, použijte následující příkaz k vyhledání hodnoty Transactions ve vlastnosti Capabilities zprostředkovatelů:
Get-PSProvider | Where-Object {$_.Capabilities -like "*transactions*"}
Další informace o poskytovateli najdete v nápovědě k poskytovateli. Pokud chcete získat nápovědu k poskytovateli, zadejte:
Get-Help <provider-name>
Pokud například chcete získat nápovědu pro zprostředkovatele registru, zadejte:
Get-Help registry
Parametr UseTransaction
Rutiny, které můžou podporovat transakce, mají parametr UseTransaction . Tento parametr zahrnuje příkaz v aktivní transakci. Můžete použít úplný název parametru nebo jeho alias usetx.
Parametr lze použít pouze v případech, kdy relace obsahuje aktivní transakci. Pokud zadáte příkaz s parametrem UseTransaction , pokud neexistuje žádná aktivní transakce, příkaz selže.
Pokud chcete najít rutiny s parametrem UseTransaction , zadejte:
Get-Help * -Parameter UseTransaction
V powershellovém jádru podporují transakce všechny rutiny navržené tak, aby fungovaly s poskytovateli PowerShellu. V důsledku toho můžete ke správě transakcí použít rutiny zprostředkovatele.
Další informace o poskytovateli PowerShellu najdete v tématu about_Providers.
Objekt transakce
Transakce jsou reprezentovány v PowerShell objektu transakce System.Management.Automation.Transaction.
Objekt má následující vlastnosti:
RollbackPreference: Obsahuje předvolbu vrácení zpět nastavenou pro aktuální transakci. Předvolbu vrácení zpět můžete nastavit při spuštění
Start-Transaction
transakce.Předvolba vrácení zpět určuje podmínky, za kterých se transakce automaticky vrátí zpět. Platné hodnoty jsou
Error
,TerminatingError
aNever
. Výchozí hodnota jeError
.Stav: Obsahuje aktuální stav transakce. Platné hodnoty jsou
Active
,Committed
aRolledBack
.SubscriberCount: Obsahuje počet odběratelů transakce. Odběratel se přidá do transakce při spuštění transakce, zatímco probíhá jiná transakce. Počet odběratelů je dekrementován, když odběratel potvrdí transakci.
Aktivní transakce
V PowerShellu je vždy aktivní jenom jedna transakce a můžete spravovat pouze aktivní transakci. Ve stejné relaci může probíhat více transakcí současně, ale aktivní je pouze poslední spuštěná transakce.
V důsledku toho nemůžete určit konkrétní transakci při použití transakčních rutin. Příkazy se vždy vztahují na aktivní transakci.
To je nejjevnější v chování rutiny Get-Transaction
. Když zadáte Get-Transaction
příkaz, Get-Transaction
vždy získá pouze jeden objekt transakce. Tento objekt je objekt, který představuje aktivní transakci.
Chcete-li spravovat jinou transakci, musíte nejprve dokončit aktivní transakci buď potvrzením nebo vrácením zpět. Když to uděláte, předchozí transakce se automaticky aktivuje. Transakce se aktivují v opačném pořadí, ve kterém jsou spuštěny, takže poslední spuštěná transakce je vždy aktivní.
Odběratelé a nezávislé transakce
Pokud spustíte transakci, zatímco probíhá jiná transakce, PowerShell ve výchozím nastavení nespustí novou transakci. Místo toho přidá do aktuální transakce "odběratele".
Pokud má transakce více odběratelů, jeden Undo-Transaction
příkaz v každém okamžiku vrátí zpět celou transakci pro všechny předplatitele.
Chcete-li však transakci potvrdit, musíte zadat Complete-Transaction
příkaz pro každého odběratele.
Chcete-li zjistit počet odběratelů transakce, zkontrolujte vlastnost SubscriberCount objektu transakce. Například následující příkaz používá rutinu Get-Transaction
k získání hodnoty Vlastnosti SubscriberCount aktivní transakce:
(Get-Transaction).SubscriberCount
Přidání odběratele je výchozí chování, protože většina transakcí, které jsou spuštěny, zatímco probíhá jiná transakce, souvisí s původní transakcí. V typickém modelu skript obsahující transakci volá pomocný skript, který obsahuje vlastní transakci. Vzhledem k tomu, že transakce souvisejí, měly by být vráceny zpět nebo potvrzeny jako jednotka.
Můžete však spustit transakci, která je nezávislá na aktuální transakci pomocí nezávislého parametru rutiny Start-Transaction
.
Když spustíte nezávislou transakci, Start-Transaction
vytvoří nový objekt transakce a nová transakce se stane aktivní transakcí. Nezávislá transakce může být potvrzena nebo vrácena zpět, aniž by to mělo vliv na původní transakci.
Po dokončení nezávislé transakce (potvrzená nebo vrácena zpět), původní transakce se znovu stane aktivní transakcí.
Změna dat
Pokud ke změně dat použijete transakce, data ovlivněná transakcí se nezmění, dokud transakci nezapíšete. Stejná data ale můžou být změněna příkazy, které nejsou součástí transakce.
Mějte na paměti, když ke správě sdílených dat používáte transakce. Databáze obvykle mají mechanismy, které zamknou data, když na něm pracujete, brání ostatním uživatelům a dalším příkazům, skriptům a funkcím, aby je změnily.
Zámek je ale funkcí databáze. Nesouvisí s transakcemi. Pokud pracujete v systému souborů s podporou transakcí nebo v jiném úložišti dat, je možné tato data během probíhající transakce změnit.
Příklady
Příklady v této části používají zprostředkovatele registru PowerShellu a předpokládají, že ho znáte. Informace o poskytovateli registru zadejte Get-Help registry
.
Příklad 1: Potvrzení transakce
K vytvoření transakce použijte rutinu Start-Transaction
. Následující příkaz spustí transakci s výchozím nastavením.
Start-Transaction
Pokud chcete do transakce zahrnout příkazy, použijte parametr UseTransaction rutiny. Ve výchozím nastavení nejsou příkazy zahrnuty do transakce,
Například následující příkaz, který nastaví aktuální umístění v softwarovém HKCU:
klíči jednotky, není součástí transakce.
cd hkcu:\Software
Následující příkaz, který vytvoří MyCompany klíč, používá UseTransaction parametr New-Item
rutiny k zahrnutí příkazu do aktivní transakce.
New-Item MyCompany -UseTransaction
Příkaz vrátí objekt, který představuje nový klíč, ale protože příkaz je součástí transakce, registr se ještě nezměnil.
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
0 0 MyCompany {}
K potvrzení transakce použijte rutinu Complete-Transaction
. Vzhledem k tomu, že vždy ovlivňuje aktivní transakci, nemůžete zadat transakci.
Complete-Transaction
V důsledku toho MyCompany
se klíč přidá do registru.
dir m*
Hive: HKEY_CURRENT_USER\software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany {}
Příklad 2: Vrácení transakce zpět
K vytvoření transakce použijte rutinu Start-Transaction
. Následující příkaz spustí transakci s výchozím nastavením.
Start-Transaction
Následující příkaz, který vytvoří MyOtherCompany klíč, používá UseTransaction parametr New-Item
rutiny k zahrnutí příkazu do aktivní transakce.
New-Item MyOtherCompany -UseTransaction
Příkaz vrátí objekt, který představuje nový klíč, ale protože příkaz je součástí transakce, registr se ještě nezměnil.
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
0 0 MyOtherCompany {}
K vrácení transakce zpět použijte rutinu Undo-Transaction
. Vzhledem k tomu, že vždy ovlivňuje aktivní transakci, nezadáte transakci.
Undo-Transaction
Výsledkem je, že MyOtherCompany
klíč není přidaný do registru.
dir m*
Hive: HKEY_CURRENT_USER\software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany {}
Příklad 3: Zobrazení náhledu transakce
Příkazy použité v transakčních datech se obvykle mění. Příkazy, které získávají data, jsou však užitečné i v transakci, protože získávají data uvnitř transakce. To poskytuje náhled změn, které by potvrzení transakce způsobily.
Následující příklad ukazuje, jak pomocí Get-ChildItem
příkazu (alias je dir
) zobrazit náhled změn v transakci.
Následující příkaz spustí transakci.
Start-Transaction
Následující příkaz pomocí rutiny New-ItemProperty
přidá MyKey
položku registru do klíče MyCompany. Příkaz používá UseTransaction parametr zahrnout příkaz do transakce.
New-Itemproperty -path MyCompany -Name MyKey -value 123 -UseTransaction
Příkaz vrátí objekt představující novou položku registru, ale položka registru se nezmění.
MyKey
-----
123
Chcete-li získat položky, které jsou aktuálně v registru, použijte Get-ChildItem
příkaz (dir
) bez parametru UseTransaction. Následující příkaz získá položky, které začínají na "M".
dir m*
Výsledek ukazuje, že do MyCompany
klíče ještě nebyly přidány žádné položky.
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany {}
Pokud chcete zobrazit náhled efektu potvrzení transakce, zadejte Get-ChildItem
příkaz (dir
) s parametrem UseTransaction. Tento příkaz obsahuje zobrazení dat v rámci transakce.
dir m* -useTransaction
Výsledek ukazuje, že pokud je transakce potvrzena, MyKey
položka se přidá do MyCompany
klíče.
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 1 MyCompany {MyKey}
Příklad 4: Kombinování transactovaných a neprovedených příkazů
Během transakce můžete zadat neprovedené příkazy. Neprovedené příkazy ovlivňují data okamžitě, ale nemají vliv na transakci.
Následující příkaz spustí transakci v HKCU:\Software
klíči registru.
Start-Transaction
Následující tři příkazy používají rutinu New-Item
k přidání klíčů do registru.
První a třetí příkazy používají parametr UseTransaction k zahrnutí příkazů do transakce. Druhý příkaz vynechá parametr. Protože druhý příkaz není součástí transakce, je efektivní okamžitě.
New-Item MyCompany1 -UseTransaction
New-Item MyCompany2
New-Item MyCompany3 -UseTransaction
Pokud chcete zobrazit aktuální stav registru, použijte Get-ChildItem
příkaz (dir
) bez parametru UseTransaction. Tento příkaz získá položky, které začínají M
.
dir m*
Výsledek ukazuje, že MyCompany2
klíč se přidá do registru, ale MyCompany1
klíče MyCompany3
, které jsou součástí transakce, se nepřidají.
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany2 {}
Následující příkaz potvrdí transakci.
Complete-Transaction
Nyní se klíče přidané jako součást transakce zobrazí v registru.
dir m*
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany1 {}
0 0 MyCompany2 {}
0 0 MyCompany3 {}
Příklad 5: Použití automatického vrácení zpět
Když příkaz v transakci vygeneruje chybu jakéhokoli druhu, transakce se automaticky vrátí zpět.
Toto výchozí chování je určeno pro skripty, které spouští transakce. Skripty jsou obvykle dobře testovány a zahrnují logiku zpracování chyb, takže chyby nejsou očekávané a měly by ukončit transakci.
První příkaz spustí transakci v HKCU:\Software
klíči registru.
Start-Transaction
Následující příkaz pomocí rutiny New-Item
přidá MyCompany
klíč do registru. Příkaz používá parametr UseTransaction (alias je usetx) k zahrnutí příkazu do transakce.
New-Item MyCompany -usetx
MyCompany
Protože klíč již v registru existuje, příkaz selže a transakce se vrátí zpět.
New-Item : A key at this path already exists
At line:1 char:9
+ New-Item <<<< MyCompany -usetx
Příkaz Get-Transaction
potvrdí, že transakce byla vrácena zpět a že SubscriberCount je 0.
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 0 RolledBack
Příklad 6: Změna předvolby vrácení zpět
Pokud chcete, aby transakce byla odolnější proti chybám, můžete změnit předvolbu pomocí parametru Start-Transaction
RollbackPreference.
Následující příkaz spustí transakci s předvolbou vrácení zpět .Never
Start-Transaction -RollbackPreference Never
V takovém případě, když příkaz selže, transakce se automaticky nevrátí zpět.
New-Item MyCompany -usetx
New-Item : A key at this path already exists
At line:1 char:9
+ New-Item <<<< MyCompany -usetx
Vzhledem k tomu, že transakce je stále aktivní, můžete příkaz znovu odeslat jako součást transakce.
New-Item MyOtherCompany -usetx
Příklad 7: Použití rutiny Use-Transaction
Tato Use-Transaction
rutina umožňuje provádět přímé skriptování proti objektům rozhraní Microsoft .NET Framework s podporou transakcí. Use-Transaction
přebírá blok skriptu, který může obsahovat pouze příkazy a výrazy, které používají objekty rozhraní .NET Framework s podporou transakcí, například instance Microsoft.PowerShell.Commands.Management.TransactedString třídy.
Následující příkaz spustí transakci.
Start-Transaction
Následující New-Object
příkaz vytvoří instanci TransactedString třídy a uloží ji do $t
proměnné.
$t = New-Object Microsoft.PowerShell.Commands.Management.TransactedString
Následující příkaz používá Append metoda TransactedString objektu přidat text do řetězce. Protože příkaz není součástí transakce, změna je efektivní okamžitě.
$t.append("Windows")
Následující příkaz používá stejnou metodu Append k přidání textu, ale přidá text jako součást transakce. Příkaz je uzavřený ve složených závorkách a nastaví se jako hodnota parametru ScriptBlock parametru Use-Transaction
. Je vyžadován parametr UseTransaction (usetx).
Use-Transaction {$t.append(" PowerShell")} -usetx
Chcete-li zobrazit aktuální obsah transacted řetězec v $t
, použijte ToString
metodu TransactedString objektu.
$t.tostring()
Výstup ukazuje, že efektivní jsou pouze neprovedené změny.
Windows
Pokud chcete zobrazit aktuální obsah transactovaného řetězce v $t z transakce, vložte výraz do Use-Transaction
příkazu.
Use-Transaction {$t.tostring()} -usetx
Výstup zobrazuje zobrazení transakce.
PowerShell
Následující příkaz potvrdí transakci.
Complete-Transaction
Konečný řetězec zobrazíte tak, že:
$t.tostring()
PowerShell
Příklad 8: Správa transakcí s více předplatiteli
Když spustíte transakci, zatímco probíhá jiná transakce, PowerShell ve výchozím nastavení nevytvoří druhou transakci. Místo toho přidá odběratele k aktuální transakci.
Tento příklad ukazuje, jak zobrazit a spravovat transakci s více předplatiteli.
Začněte spuštěním transakce v klíči HKCU:\Software
.
Start-Transaction
Následující příkaz používá Get-Transaction
příkaz k získání aktivní transakce.
Get-Transaction
Výsledek ukazuje objekt, který představuje aktivní transakci.
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
Následující příkaz přidá klíč MyCompany do registru. Příkaz používá UseTransaction parametr zahrnout příkaz do transakce.
New-Item MyCompany -UseTransaction
Následující příkaz pomocí Start-Transaction
příkazu spustí transakci. I když je tento příkaz zadán na příkazovém řádku, je tento scénář pravděpodobnější, když spustíte skript, který obsahuje transakci.
Start-Transaction
Příkaz Get-Transaction
ukazuje, že se zvýší počet odběratelů na objektu transakce. Hodnota je teď 2.
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 2 Active
Následující příkaz pomocí rutiny New-ItemProperty
přidá položku registru MyKey do klíče MyCompany. Používá UseTransaction parametr zahrnout příkaz do transakce.
New-ItemProperty -path MyCompany -name MyKey -UseTransaction
Klíč MyCompany v registru neexistuje, ale tento příkaz je úspěšný, protože tyto dva příkazy jsou součástí stejné transakce.
Následující příkaz potvrdí transakci. Pokud by se transakce vrátila zpět, transakce by byla vrácena zpět pro všechny odběratele.
Complete-Transaction
Příkaz Get-Transaction
ukazuje, že počet odběratelů na objekt transakce je 1, ale hodnota Status je stále Aktivní (není potvrzeno).
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
Chcete-li dokončit potvrzení transakce, zadejte druhý Complete- Transaction příkaz. Pokud chcete potvrdit transakci s více předplatiteli, musíte pro každý Start-Transaction
příkaz zadat jeden Complete-Transaction
příkaz.
Complete-Transaction
Další Get-Transaction
příkaz ukazuje, že transakce byla potvrzena.
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 0 Committed
Příklad 9: Správa nezávislých transakcí
Když spustíte transakci v době, kdy probíhá jiná transakce, můžete použít nezávislý parametr Start-Transaction
k vytvoření nové transakce nezávislé na původní transakci.
Když to uděláte, Start-Transaction
vytvoří nový objekt transakce a vytvoří novou transakci aktivní transakce.
Začněte spuštěním transakce v klíči HKCU:\Software
.
Start-Transaction
Následující příkaz používá Get-Transaction
příkaz k získání aktivní transakce.
Get-Transaction
Výsledek ukazuje objekt, který představuje aktivní transakci.
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
Následující příkaz přidá klíč registru MyCompany jako součást transakce. Používá UseTransaction parametr (usetx) k zahrnutí příkazu do aktivní transakce.
New-Item MyCompany -use
Následující příkaz spustí novou transakci. Příkaz používá nezávislý parametr k označení, že tato transakce není odběratelem aktivní transakce.
Start-Transaction -Independent
Když vytvoříte nezávislou transakci, nová (naposledy vytvořená) transakce se stane aktivní transakcí. K získání aktivní transakce můžete použít Get-Transaction
příkaz.
Get-Transaction
Všimněte si, že SubscriberCount transakce je 1, což znamená, že neexistují žádní další odběratelé a že transakce je nová.
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
Aby bylo možné spravovat původní transakci, musí být nová transakce dokončena (potvrzená nebo vrácena zpět).
Následující příkaz přidá klíč MyOtherCompany do registru. Používá UseTransaction parametr (usetx) k zahrnutí příkazu do aktivní transakce.
New-Item MyOtherCompany -usetx
Nyní vraťte transakci zpět. Pokud by došlo k jedné transakci se dvěma odběrateli, vrácení zpět transakce by vrátila celou transakci pro všechny předplatitele.
Vzhledem k tomu, že tyto transakce jsou nezávislé, vrácení nejnovější transakce zruší změny registru a provede původní transakci aktivní transakce.
Undo-Transaction
Příkaz Get-Transaction
potvrdí, že původní transakce je stále aktivní v relaci.
Get-Transaction
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
Následující příkaz potvrdí aktivní transakci.
Complete-Transaction
Příkaz Get-ChildItem
ukazuje, že došlo ke změně registru.
dir m*
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany {}