Sdílet prostřednictvím


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 a Never. Výchozí hodnota je Error.

  • Stav: Obsahuje aktuální stav transakce. Platné hodnoty jsou Active, Committed a RolledBack.

  • 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                      {}

Viz také