Sdílet prostřednictvím


O transakcích

STRUČNÝ POPIS

Popisuje, jak spravovat transakční operace v PowerShellu.

DLOUHÝ POPIS

V PowerShellu se transakce podporují od PowerShellu 2.0. Tato funkce umožňuje zahájit 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"), což změní data ovlivněná transakcí. Nebo může být transakce zcela vrácena zpět ("vrácena zpět"), aby ovlivněná data nebyla touto transakcí změněna.

Vzhledem k tomu, že příkazy v transakci jsou spravovány jako celek, jsou buď všechny příkazy potvrzeny, nebo jsou vráceny zpět.

Transakce se široce 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í to, že všechny selžou, ale že některé příkazy jsou úspěšné, zatímco jiné selžou, takže systém je v poškozeném, nesprávném nebo neinterpretovatelném stavu, který je obtížné opravit.

TRANSAKČNÍ RUTINY

PowerShell obsahuje několik rutin určených ke správě transakcí.

  • Start-Transaction: Spustí novou transakci.
  • Use-Transaction: Přidá příkaz nebo výraz do transakce. Příkaz musí používat objekty s povolenými transakcemi.
  • Zpět transakce: Vrátí zpět transakci tak, aby transakce nezměnila žádná data.
  • Complete-Transaction: Potvrdí transakci. Změní se data ovlivněná transakcí.
  • Get-Transaction: Získá informace o aktivní transakci.

Seznam transakčních rutin zobrazíte zadáním:

get-command *transaction

Podrobné informace o rutinách získáte zadáním:

get-help use-transaction -detailed

ELEMENTY S POVOLENÝMI TRANSAKCEMI

Chcete-li se účastnit transakce, musí rutina i zprostředkovatel podporovat transakce. Tato funkce je integrována do objektů, které jsou ovlivněny transakcí.

Zprostředkovatel registru Prostředí PowerShell podporuje transakce v systému Windows Vista. Objekt TransactedString (Microsoft.PowerShell.Commands.Management.TransactedString) funguje s jakýmkoli operačním systémem, ve kterém běží PowerShell.

Transakce můžou podporovat i jiní zprostředkovatelé PowerShellu. Pokud chcete ve své relaci najít zprostředkovatele PowerShellu, kteří podporují 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 poskytovatele 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, když neexistuje žádná aktivní transakce, příkaz selže.

Pokud chcete vyhledat 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 v PowerShellu reprezentované objektem 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ři spuštění transakce pomocí Start-Transaction můžete nastavit předvolbu vrácení zpět.

    Předvolba vrácení zpět určuje podmínky, za kterých se transakce automaticky vrátí zpět. Platné hodnoty jsou Error( Chyba), TerminatingError (Ukončovací chyba) a Never (Nikdy). Výchozí hodnota je Chyba.

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

  • SubscriberCount: Obsahuje počet odběratelů transakce. Odběratel je přidán k transakci při zahájení transakce, zatímco probíhá jiná transakce. Počet odběratelů se sníží, když odběratel potvrdí transakci.

AKTIVNÍ TRANSAKCE

V PowerShellu je aktivní jenom jedna transakce najednou a můžete spravovat jenom aktivní transakci. Ve stejné relaci může probíhat více transakcí ve stejnou dobu, ale aktivní je pouze naposledy spuštěná transakce.

V důsledku toho nelze určit konkrétní transakci při použití transakční rutiny. Příkazy se vždy vztahují na aktivní transakci.

Nejvýraznější je to 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 opačném pořadí, než ve kterém jsou zahájeny, takže naposledy zahájená transakce je vždy aktivní.

ODBĚRATELÉ A NEZÁVISLÉ TRANSAKCE

Pokud spustíte transakci v době, kdy probíhá jiná transakce, PowerShell ve výchozím nastavení nespustí novou transakci. Místo toho přidá "odběratele" k aktuální transakci.

Pokud má transakce více odběratelů, jeden Undo-Transaction příkaz v libovolném okamžiku 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 SubscriberCount vlastnost 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 v průběhu jiné transakce souvisí s původní transakce. 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 celek.

Můžete však spustit transakci, která je nezávislá na aktuální transakci pomocí nezávislé 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 (potvrzena nebo vrácena zpět), původní transakce se znovu stane aktivní transakcí.

ZMĚNA DAT

Když použijete transakce ke změně dat, data, která jsou ovlivněna transakcí, se nezmění, dokud transakce nepotádáte. Stejná data však mohou být změněny příkazy, které nejsou součástí transakce.

Mějte to 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 nich pracujete, a brání ostatním uživatelům a dalším příkazům, skriptům a funkcím v jejich změně.

Zámek je však funkcí databáze. Nesouvisí s transakcemi. Pokud pracujete v systému souborů s povolenou transakcí nebo v jiném úložišti dat, mohou být data v průběhu transakce změněna.

PŘÍKLADY

V příkladech v této části se používá zprostředkovatele registru PowerShellu a předpokládá se, že ho znáte. Informace o poskytovateli 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 klíči Software jednotky HKCU: není součástí transakce.

cd hkcu:\Software

Následující příkaz, který vytvoří klíč MyCompany, použije parametr UseTransaction rutiny New-Item 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, nelze transakci zadat.

complete-transaction

V důsledku toho se do registru přidá klíč MyCompany.

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ří klíč MyOtherCompany, použije parametr UseTransaction rutiny New-Item 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 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 transakci obvykle mění data. Příkazy, které získávají data, jsou však užitečné i v transakci, protože získávají data uvnitř transakce. Zobrazí se náhled změn, které by potvrzení transakce způsobilo.

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 pomocí rutiny New-ItemProperty přidá položku registru MyKey do klíče MyCompany. Příkaz používá parametr UseTransaction k zahrnutí příkazu 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í písmenem 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                      {}

Pokud chcete zobrazit náhled efektu potvrzení transakce, zadejte příkaz Get-ChildItem ("dir") s parametrem UseTransaction. Tento příkaz má zobrazení dat z transakce.

dir m* -useTransaction

Výsledek ukazuje, že pokud je transakce potvrzena, bude položka MyKey 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 NON-TRANSACTED PŘÍKAZŮ

Během transakce můžete zadat ne transakční příkazy. Neprovedené příkazy ovlivňují data okamžitě, ale neovlivňují 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ů v transakci. Druhý příkaz vynechá parametr . Vzhledem k tomu, že druhý příkaz není zahrnut v transakci, je účinná 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 načte položky, které začínají písmenem "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

Teď 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 je automaticky vrácena zpět.

Toto výchozí chování je určeno pro skripty, které spouštějí transakce. Skripty jsou obvykle dobře otestované a obsahují logiku zpracování chyb, takže chyby se neočekávají a měly by transakci ukončit.

První příkaz spustí transakci v klíči registru HKCU:\Software.

start-transaction

Následující příkaz použije 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 je vrácena 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 znovu odeslat příkaz 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 povolenými transakcemi. 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 třídy Microsoft.PowerShell.Commands.Management.TransactedString.

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

start-transaction

Následující New-Object příkaz vytvoří instanci Třídy TransactedString a uloží ji do proměnné $t.

$t = New-Object Microsoft.PowerShell.Commands.Management.TransactedString

Následující příkaz používá metodu Append objektu TransactedString k přidání textu do řetězce. Vzhledem k tomu, že příkaz není součástí transakce, změna je účinná 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 parametru ScriptBlock parametru Use-Transaction. Parametr UseTransaction (UseTx) je povinný.

use-transaction {$t.append(" PowerShell")} -usetx

Chcete-li zobrazit aktuální obsah transakčního řetězce v $t, použijte metodu ToString TransactedString objektu.

$t.tostring()

Výstup ukazuje, že jsou platné pouze neprovedené změny.

Windows

Pokud chcete zobrazit aktuální obsah transakčního řetězce v $t v rámci transakce, vložte výraz do příkazu Use-Transaction.

use-transaction {$s.tostring()} -usetx

Výstup zobrazí 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

Při spuštění transakce v době, kdy 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 odběrateli.

Začněte spuštěním transakce v klíči HKCU:\Software.

start-transaction

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

get-transaction

Výsledek zobrazí 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á parametr UseTransaction k zahrnutí příkazu do transakce.

new-item MyCompany -UseTransaction

Následující příkaz použije ke spuštění transakce příkaz Start-Transaction. I když je tento příkaz zadán na příkazovém řádku, tento scénář je pravděpodobnější, když spustíte skript, který obsahuje transakci.

start-transaction

Příkaz Get-Transaction ukazuje, že počet odběratelů na objekt transakce je zvýšení. 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á parametr UseTransaction k zahrnutí příkazu v transakci.

new-itemproperty -path MyCompany -name MyKey -UseTransaction

Klíč MyCompany neexistuje v registru, ale tento příkaz bude ú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 předplatitele.

complete-transaction

Příkaz Get-Transaction ukazuje, že počet odběratelů v objektu transakce je 1, ale hodnota Status je stále Aktivní (ne Potvrzeno).

RollbackPreference   SubscriberCount   Status
------------------   ---------------   ------
Error                1                 Active

Chcete-li dokončit potvrzení transakce, zadejte druhý příkaz Complete- Transaction. Chcete-li potvrdit transakci s více odběrateli, je nutné zadat jeden Complete-Transaction příkaz pro každý příkaz Start-Transaction.

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Í

Při spuštění transakce 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ž tak učiníte, Start-Transaction vytvoří nový objekt transakce a nová transakce aktivní transakce.

Začněte spuštěním transakce v klíči HKCU:\Software.

start-transaction

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

get-transaction

Výsledek zobrazí 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á parametr UseTransaction (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

Nová transakce musí být dokončena (potvrzena nebo vrácena zpět), abyste mohli spravovat původní transakci.

Následující příkaz přidá klíč MyOtherCompany do registru. Používá parametr UseTransaction (UseTx) k zahrnutí příkazu do aktivní transakce.

new-item MyOtherCompany -usetx

Teď vraťte transakci zpět. Pokud by došlo k jedné transakci se dvěma odběrateli, vrácením transakce zpět by se vrátila celá transakce pro všechny předplatitele.

Vzhledem k tomu, že tyto transakce jsou nezávislé, vrácení nejnovější transakce zpět zruší změny registru a původní transakce 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 registr byl změněn.

dir m*
Hive: HKEY_CURRENT_USER\Software

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

VIZ TAKÉ

Start-Transaction

Get-Transaction

Complete-Transaction

Undo-Transaction

Use-Transaction

Get-PSProvider

Get-ChildItem

about_Providers