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.

O TRANSAKCÍCH

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 zpět ("vrácen 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, opustí 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í.
  • Vrácení transakce zpět: Vrátí zpět transakci 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

ELEMENTY 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 v systému Windows Vista. Objekt TransactedString (Microsoft.PowerShell.Commands.Management.TransactedString) funguje s jakýmkoli operačním systémem, na kterém běží PowerShell.

Ostatní poskytovatelé PowerShellu můžou podporovat transakce. Pokud chcete najít zprostředkovatele PowerShellu ve vaší relaci, která podporuje transakce, pomocí následujícího příkazu vyhledejte hodnotu Transactions ve vlastnosti Capabilities zprostředkovatelů:

get-psprovider | where {$_.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é pro práci 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í transakce pomocí metody Start-Transaction.

    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 Aktivní, Potvrzené 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 nelze 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 příkaz Get-Transaction, 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 stanou aktivní v obrácené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 příkaz Undo-Transaction v libovolném bodě vrátí zpět celou transakci pro všechny odběratele. Chcete-li však transakci potvrdit, musíte zadat příkaz Complete-Transaction 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í independent parametru Start-Transaction rutiny.

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

Při použití transakcí ke změně dat, data ovlivněná transakcí se nezmění, dokud transakce nespíšete. Stejná data však mohou 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 zprostředkovateli registru získáte zadáním příkazu 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 klíči HKCU: jednotka, není součástí transakce.

cd hkcu:\Software

Následující příkaz, který vytvoří MyCompany klíč, používá UseTransaction parametr New-Item rutiny zahrnout příkaz 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ění.

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, nelze zadat transakci.

complete-transaction

V důsledku toho se klíč MyCompany 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 zahrnout příkaz 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ění.

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 klíč MyOtherCompany není přidán 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í příkazu Get-ChildItem (alias je "dir") zobrazit náhled změn v transakci.

Následující příkaz spustí transakci.

start-transaction

Následující příkaz používá rutinu New-ItemProperty k přidání položky registru MyKey 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 příkaz Get-ChildItem ("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 klíče MyCompany 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                      {}

Chcete-li zobrazit náhled efekt potvrzení transakce, zadejte Get-ChildItem ("dir") příkaz s parametrem UseTransaction. Tento příkaz obsahuje zobrazení dat v rámci transakce.

dir m* -useTransaction

Výsledek ukazuje, že pokud transakce je potvrzena, MyKey položka bude přidána do klíče MyCompany.

Hive: HKEY_CURRENT_USER\Software

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

PŘÍKLAD 4: KOMBINOVÁNÍ TRANSACTED A NEAKTOVANÝ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 klíči registru HKCU:\Software.

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. Vzhledem k tomu, že druhý příkaz není zahrnut v transakci, je efektivní okamžitě.

new-item MyCompany1 -UseTransaction
new-item MyCompany2
new-item MyCompany3 -UseTransaction

Pokud chcete zobrazit aktuální stav registru, použijte příkaz Get-ChildItem ("dir") bez parametru UseTransaction. Tento příkaz získá položky, které začínají na "M".

dir m*

Výsledek ukazuje, že klíč MyCompany2 je přidán do registru, ale klíče MyCompany1 a MyCompany3, které jsou součástí transakce, nejsou přidány.

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 klíči registru HKCU:\Software.

start-transaction

Následující příkaz používá rutinu New-Item k přidání klíče MyCompany do registru. Příkaz používá parametr UseTransaction (alias je "usetx") k zahrnutí příkazu do transakce.

New-Item MyCompany -UseTX

Protože klíč MyCompany 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 potvrzuje, ž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 RollbackPreference start-Transaction.

Následující příkaz spustí transakci s předvolbou vrácení zpět "Nikdy".

start-transaction -rollbackpreference Never

V takovém případě, když příkaz selže, transakce není automaticky vrácena 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

Rutina Use-Transaction 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í příkaz New-Object 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 je nastaven jako hodnota 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 metoda 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 příkazu Use-Transaction.

use-transaction {$s.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 HKCU:\Software klíč.

start-transaction

Následující příkaz používá k získání aktivní transakce příkaz Get-Transaction.

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 ke spuštění transakce používá příkaz Start-Transaction. 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

Další příkaz použije rutinu New-ItemProperty k přidání položky 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. Chcete-li potvrdit transakci s více odběrateli, musíte zadat jeden příkaz Complete-Transaction pro každý příkaz Start-Transaction.

complete-transaction

Další příkaz Get-Transaction ukazuje, že transakce byla potvrzena.

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

PŘÍKLAD 9: SPRÁVA NEZÁVISLÝCH TRANSAKCÍ

Když spustíte transakci, zatímco 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 HKCU:\Software klíč.

start-transaction

Následující příkaz používá k získání aktivní transakce příkaz Get-Transaction.

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 příkaz Get-Transaction.

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 potvrzuje, ž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é