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