about_Transactions
簡単な説明
PowerShell でトランザクション操作を管理する方法について説明します。
詳細な説明
トランザクションは、PowerShell 2.0 以降の PowerShell でサポートされています。 この機能を使用すると、トランザクションの開始、トランザクションの一部であるコマンドの指定、トランザクションのコミットまたはロールバックを行うことができます。
PowerShell では、トランザクションは論理ユニットとして管理される 1 つ以上のコマンドのセットです。 トランザクションを完了 ("コミット") すると、トランザクションの影響を受けるデータが変更されます。 または、影響を受けるデータがトランザクションによって変更されないように、トランザクションを完全に元に戻す ("ロールバック") ことができます。
トランザクション内のコマンドは 1 つの単位として管理されるため、すべてのコマンドがコミットされるか、すべてのコマンドがロールバックされます。
トランザクションは、データ処理で広く使用されています。特に、データベース操作や金融トランザクションで使用されます。 トランザクションは、一連のコマンドの最悪のシナリオですべてが失敗するわけではありませんが、一部のコマンドは成功し、他のコマンドは失敗し、システムは修復が困難な破損、偽、または解釈不可能な状態のままで済む場合に最もよく使用されます。
トランザクション コマンドレット
PowerShell には、トランザクションを管理するために設計されたいくつかのコマンドレットが含まれています。
-
Start-Transaction
: 新しいトランザクションを開始します。 -
Use-Transaction
: コマンドまたは式をトランザクションに追加します。 このコマンドでは、トランザクションが有効なオブジェクトを使用する必要があります。 -
Undo-Transaction
: トランザクションによってデータが変更されないようにトランザクションをロールバックします。 -
Complete-Transaction
: トランザクションをコミットします。 トランザクションの影響を受けるデータが変更されます。 -
Get-Transaction
: アクティブなトランザクションに関する情報を取得します。
トランザクション コマンドレットの一覧については、次のように入力します。
Get-Command *transaction
コマンドレットの詳細については、次のように入力します。
Get-Help Use-Transaction -Detailed
トランザクションが有効な要素
トランザクションに参加するには、コマンドレットとプロバイダーの両方でトランザクションをサポートする必要があります。 この機能は、トランザクションの影響を受けるオブジェクトに組み込まれています。
PowerShell レジストリ プロバイダーは、Windows でのトランザクションをサポートしています。 TransactedString オブジェクトは、PowerShell を実行するすべてのオペレーティング システムで動作します。
他の PowerShell プロバイダーはトランザクションをサポートできます。 トランザクションをサポートするセッション内の PowerShell プロバイダーを見つけるには、次のコマンドを使用して、プロバイダーの Capabilities プロパティで Transactions 値を見つけます。
Get-PSProvider | Where-Object {$_.Capabilities -like "*transactions*"}
プロバイダーの詳細については、プロバイダーのヘルプを参照してください。 プロバイダーのヘルプを表示するには、次のように入力します。
Get-Help <provider-name>
たとえば、Registry プロバイダーのヘルプを取得するには、次のように入力します。
Get-Help registry
UseTransaction パラメーター
トランザクションをサポートできるコマンドレットには、 UseTransaction パラメーターがあります。 このパラメーターには、アクティブなトランザクションにコマンドが含まれます。 完全なパラメーター名またはそのエイリアス ( usetx を使用できます。
このパラメーターは、セッションにアクティブなトランザクションが含まれている場合にのみ使用できます。 アクティブなトランザクションがないときに UseTransaction パラメーターを指定してコマンドを入力すると、コマンドは失敗します。
UseTransaction パラメーターを持つコマンドレットを検索するには、次のように入力します。
Get-Help * -Parameter UseTransaction
PowerShell コアでは、PowerShell プロバイダーと連携するように設計されたすべてのコマンドレットがトランザクションをサポートします。 その結果、プロバイダー コマンドレットを使用してトランザクションを管理できます。
PowerShell プロバイダーの詳細については、「 about_Providers」を参照してください。
トランザクション オブジェクト
トランザクションは、PowerShell でトランザクション オブジェクト System.Management.Automation.Transaction によって表されます。
オブジェクトには、次のプロパティがあります。
RollbackPreference: 現在のトランザクションのロールバック基本設定セットが含まれます。
Start-Transaction
を使用してトランザクションを開始するときに、ロールバックの基本設定を設定できます。ロールバック設定によって、トランザクションが自動的にロールバックされる条件が決まります。 有効な値は
Error
、TerminatingError
、およびNever
です。 既定値はError
です。状態: トランザクションの現在の状態が含まれます。 有効な値は
Active
、Committed
、およびRolledBack
です。SubscriberCount: トランザクションのサブスクライバーの数が含まれます。 別のトランザクションの進行中にトランザクションを開始すると、サブスクライバーがトランザクションに追加されます。 サブスクライバーがトランザクションをコミットすると、サブスクライバー数が減少します。
アクティブなトランザクション
PowerShell では、一度にアクティブなトランザクションは 1 つだけであり、アクティブなトランザクションのみを管理できます。 同じセッションで複数のトランザクションを同時に進行中にできますが、アクティブなのは最後に開始されたトランザクションだけです。
その結果、トランザクション コマンドレットを使用するときに特定のトランザクションを指定することはできません。 コマンドは常にアクティブなトランザクションに適用されます。
これは、 Get-Transaction
コマンドレットの動作で最も顕著です。
Get-Transaction
コマンドを入力すると、Get-Transaction
は常に 1 つのトランザクション オブジェクトのみを取得します。 このオブジェクトは、アクティブなトランザクションを表すオブジェクトです。
別のトランザクションを管理するには、最初にアクティブなトランザクションをコミットするかロールバックして完了する必要があります。 これを行うと、前のトランザクションが自動的にアクティブになります。 トランザクションは開始された順序とは逆にアクティブになり、最後に開始されたトランザクションは常にアクティブになります。
サブスクライバーと独立したトランザクション
別のトランザクションの進行中にトランザクションを開始した場合、既定では、PowerShell は新しいトランザクションを開始しません。 代わりに、現在のトランザクションに "サブスクライバー" が追加されます。
トランザクションに複数のサブスクライバーがある場合、任意の時点で 1 つの Undo-Transaction
コマンドによって、すべてのサブスクライバーのトランザクション全体がロールバックされます。
ただし、トランザクションをコミットするには、サブスクライバーごとに Complete-Transaction
コマンドを入力する必要があります。
トランザクションのサブスクライバー数を調べるには、トランザクション オブジェクトの SubscriberCount プロパティを確認します。 たとえば、次のコマンドでは、 Get-Transaction
コマンドレットを使用して、アクティブなトランザクションの SubscriberCount プロパティの値を取得します。
(Get-Transaction).SubscriberCount
サブスクライバーの追加は、別のトランザクションの進行中に開始されるほとんどのトランザクションが元のトランザクションに関連しているため、既定の動作です。 一般的なモデルでは、トランザクションを含むスクリプトは、独自のトランザクションを含むヘルパー スクリプトを呼び出します。 トランザクションは関連しているため、ロールバックするか、ユニットとしてコミットする必要があります。
ただし、 Start-Transaction
コマンドレットの Independent パラメーターを使用して、現在のトランザクションに依存しないトランザクションを開始できます。
独立したトランザクションを開始すると、 Start-Transaction
は新しいトランザクション オブジェクトを作成し、新しいトランザクションがアクティブなトランザクションになります。 独立したトランザクションは、元のトランザクションに影響を与えずにコミットまたはロールバックできます。
独立したトランザクションが完了 (コミットまたはロールバック) されると、元のトランザクションが再びアクティブなトランザクションになります。
データの変更
トランザクションを使用してデータを変更する場合、トランザクションの影響を受けるデータは、トランザクションをコミットするまで変更されません。 ただし、同じデータは、トランザクションの一部ではないコマンドによって変更できます。
トランザクションを使用して共有データを管理する場合は、この点に注意してください。 通常、データベースには、作業中にデータをロックするメカニズムがあり、他のユーザーや他のコマンド、スクリプト、および関数が変更されないようにします。
ただし、ロックはデータベースの機能です。 トランザクションには関係ありません。 トランザクションが有効なファイル システムまたはその他のデータ ストアで作業している場合は、トランザクションの進行中にデータを変更できます。
例
このセクションの例では、PowerShell レジストリ プロバイダーを使用し、理解していることを前提としています。 レジストリ プロバイダーの詳細については、「 Get-Help registry
」と入力します。
例 1: トランザクションのコミット
トランザクションを作成するには、 Start-Transaction
コマンドレットを使用します。 次のコマンドは、既定の設定でトランザクションを開始します。
Start-Transaction
トランザクションにコマンドを含めるには、コマンドレットの UseTransaction パラメーターを使用します。 既定では、コマンドはトランザクションに含まれません。
たとえば、 HKCU:
ドライブのソフトウェア キーの現在の場所を設定する次のコマンドは、トランザクションに含まれません。
cd hkcu:\Software
MyCompany キーを作成する次のコマンドでは、 コマンドレットの New-Item
パラメーターを使用して、アクティブなトランザクションにコマンドを含めます。
New-Item MyCompany -UseTransaction
このコマンドは新しいキーを表すオブジェクトを返しますが、コマンドはトランザクションの一部であるため、レジストリはまだ変更されていません。
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
0 0 MyCompany {}
トランザクションをコミットするには、 Complete-Transaction
コマンドレットを使用します。 これは常にアクティブなトランザクションに影響するため、トランザクションを指定することはできません。
Complete-Transaction
その結果、 MyCompany
キーがレジストリに追加されます。
dir m*
Hive: HKEY_CURRENT_USER\software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany {}
例 2: トランザクションのロールバック
トランザクションを作成するには、 Start-Transaction
コマンドレットを使用します。 次のコマンドは、既定の設定でトランザクションを開始します。
Start-Transaction
MyOtherCompany キーを作成する次のコマンドでは、 New-Item
コマンドレットの UseTransaction パラメーターを使用して、アクティブなトランザクションにコマンドを含めます。
New-Item MyOtherCompany -UseTransaction
このコマンドは新しいキーを表すオブジェクトを返しますが、コマンドはトランザクションの一部であるため、レジストリはまだ変更されていません。
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
0 0 MyOtherCompany {}
トランザクションをロールバックするには、 Undo-Transaction
コマンドレットを使用します。 これは常にアクティブなトランザクションに影響するため、トランザクションは指定しません。
Undo-Transaction
その結果、 MyOtherCompany
キーはレジストリに追加されません。
dir m*
Hive: HKEY_CURRENT_USER\software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany {}
例 3: トランザクションのプレビュー
通常、トランザクションで使用されるコマンドはデータを変更します。 ただし、データを取得するコマンドは、トランザクション内のデータを取得するため、トランザクションでも役立ちます。 これにより、トランザクションのコミットによって引き起こされる変更のプレビューが提供されます。
次の例は、 Get-ChildItem
コマンド (エイリアスは dir
) を使用して、トランザクションの変更をプレビューする方法を示しています。
次のコマンドは、トランザクションを開始します。
Start-Transaction
次のコマンドでは、 New-ItemProperty
コマンドレットを使用して、 MyKey
レジストリ エントリを MyCompany キーに追加します。 このコマンドでは、UseTransaction パラメーターを使用して、トランザクションにコマンドを含めます。
New-Itemproperty -path MyCompany -Name MyKey -value 123 -UseTransaction
このコマンドは、新しいレジストリ エントリを表すオブジェクトを返しますが、レジストリ エントリは変更されません。
MyKey
-----
123
現在レジストリ内にある項目を取得するには、UseTransaction パラメーターを指定せずに Get-ChildItem
コマンド (dir
) を使用します。 次のコマンドは、"M" で始まる項目を取得します。
dir m*
結果は、 MyCompany
キーにエントリがまだ追加されていないことを示しています。
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany {}
トランザクションのコミットの効果をプレビューするには、UseTransaction パラメーターを使用して Get-ChildItem
(dir
) コマンドを入力します。 このコマンドには、トランザクション内のデータが表示されます。
dir m* -useTransaction
結果は、トランザクションがコミットされると、 MyKey
エントリが MyCompany
キーに追加されることを示しています。
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 1 MyCompany {MyKey}
例 4: トランザクションコマンドと非トランザクション コマンドの組み合わせ
トランザクション中に、トランザクション以外のコマンドを入力できます。 非トランザクション コマンドはデータにすぐに影響しますが、トランザクションには影響しません。
次のコマンドは、 HKCU:\Software
レジストリ キーでトランザクションを開始します。
Start-Transaction
次の 3 つのコマンドでは、 New-Item
コマンドレットを使用してレジストリにキーを追加します。
1 番目と 3 番目のコマンドでは、UseTransaction パラメーターを使用して、トランザクションにコマンドを含めます。 2 番目のコマンドは、パラメーターを省略します。 2 番目のコマンドはトランザクションに含まれていないため、すぐに有効になります。
New-Item MyCompany1 -UseTransaction
New-Item MyCompany2
New-Item MyCompany3 -UseTransaction
レジストリの現在の状態を表示するには、UseTransaction パラメーターを指定せずに Get-ChildItem
(dir
) コマンドを使用します。 このコマンドは、 M
で始まる項目を取得します。
dir m*
その結果、 MyCompany2
キーはレジストリに追加されますが、トランザクションの一部である MyCompany1
キーと MyCompany3
キーは追加されません。
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany2 {}
次のコマンドは、トランザクションをコミットします。
Complete-Transaction
これで、トランザクションの一部として追加されたキーがレジストリに表示されます。
dir m*
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany1 {}
0 0 MyCompany2 {}
0 0 MyCompany3 {}
例 5: 自動ロールバックの使用
トランザクション内のコマンドが任意の種類のエラーを生成すると、トランザクションは自動的にロールバックされます。
この既定の動作は、トランザクションを実行するスクリプト用に設計されています。 スクリプトは通常、適切にテストされ、エラー処理ロジックが含まれているため、エラーは想定されていないため、トランザクションを終了する必要があります。
最初のコマンドは、 HKCU:\Software
レジストリ キーでトランザクションを開始します。
Start-Transaction
次のコマンドでは、 New-Item
コマンドレットを使用して MyCompany
キーをレジストリに追加します。 このコマンドでは、 UseTransaction パラメーター (エイリアスは usetx) を使用して、トランザクションにコマンドを含めます。
New-Item MyCompany -usetx
MyCompany
キーはレジストリに既に存在するため、コマンドは失敗し、トランザクションはロールバックされます。
New-Item : A key at this path already exists
At line:1 char:9
+ New-Item <<<< MyCompany -usetx
Get-Transaction
コマンドは、トランザクションがロールバックされていること、および SubscriberCount が 0 であることを確認します。
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 0 RolledBack
例 6: ロールバック設定の変更
トランザクションをよりエラー トレラントにする場合は、の Start-Transaction
パラメーターを使用して基本設定を変更できます。
次のコマンドは、ロールバック設定が Never
のトランザクションを開始します。
Start-Transaction -RollbackPreference Never
この場合、コマンドが失敗しても、トランザクションは自動的にロールバックされません。
New-Item MyCompany -usetx
New-Item : A key at this path already exists
At line:1 char:9
+ New-Item <<<< MyCompany -usetx
トランザクションはまだアクティブであるため、トランザクションの一部としてコマンドを再送信できます。
New-Item MyOtherCompany -usetx
例 7: Use-Transaction
コマンドレットの使用
Use-Transaction
コマンドレットを使用すると、トランザクションが有効な Microsoft .NET Framework オブジェクトに対して直接スクリプトを実行できます。
Use-Transaction
は、トランザクションが有効な .NET Framework オブジェクト ( Microsoft.PowerShell.Commands.Management.TransactedString クラスのインスタンスなど) を使用するコマンドと式のみを含めることができるスクリプト ブロックを受け取ります。
次のコマンドは、トランザクションを開始します。
Start-Transaction
次の New-Object
コマンドは、 TransactedString クラスのインスタンスを作成し、 $t
変数に保存します。
$t = New-Object Microsoft.PowerShell.Commands.Management.TransactedString
次のコマンドでは、 TransactedString オブジェクトの Append メソッドを使用して、文字列にテキストを追加します。 コマンドはトランザクションの一部ではないので、変更はすぐに有効になります。
$t.append("Windows")
次のコマンドでは、同じ Append メソッドを使用してテキストを追加しますが、トランザクションの一部としてテキストを追加します。 コマンドは中かっこで囲まれており、の Use-Transaction
パラメーターの値として設定されます。
UseTransaction パラメーター (usetx) が必要です。
Use-Transaction {$t.append(" PowerShell")} -usetx
トランザクション文字列の現在の内容を$t
で表示するには、ToString
オブジェクトの メソッドを使用します。
$t.tostring()
出力は、トランザクションされていない変更のみが有効であることを示しています。
Windows
トランザクション内からトランザクション文字列の現在の内容を$tに表示するには、式を Use-Transaction
コマンドに埋め込みます。
Use-Transaction {$t.tostring()} -usetx
出力には、トランザクション ビューが表示されます。
PowerShell
次のコマンドは、トランザクションをコミットします。
Complete-Transaction
最後の文字列を表示するには:
$t.tostring()
PowerShell
例 8: マルチサブスクライバー トランザクションの管理
別のトランザクションの進行中にトランザクションを開始すると、PowerShell では既定では 2 つ目のトランザクションは作成されません。 代わりに、現在のトランザクションにサブスクライバーを追加します。
この例では、マルチサブスクライバー トランザクションを表示および管理する方法を示します。
まず、 HKCU:\Software
キーでトランザクションを開始します。
Start-Transaction
次のコマンドでは、 Get-Transaction
コマンドを使用してアクティブなトランザクションを取得します。
Get-Transaction
結果には、アクティブなトランザクションを表すオブジェクトが表示されます。
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
次のコマンドは、MyCompany キーをレジストリに追加します。 このコマンドでは、UseTransaction パラメーターを使用して、トランザクションにコマンドを含めます。
New-Item MyCompany -UseTransaction
次のコマンドでは、 Start-Transaction
コマンドを使用してトランザクションを開始します。 このコマンドはコマンド プロンプトで入力されますが、トランザクションを含むスクリプトを実行すると、このシナリオが発生する可能性が高くなります。
Start-Transaction
Get-Transaction
コマンドは、トランザクション オブジェクトのサブスクライバー数がインクリメントされることを示します。 値は 2 になりました。
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 2 Active
次のコマンドでは、 New-ItemProperty
コマンドレットを使用して MyKey レジストリ エントリを MyCompany キーに追加します。 UseTransaction パラメーターを使用して、トランザクションにコマンドを含めます。
New-ItemProperty -path MyCompany -name MyKey -UseTransaction
MyCompany キーはレジストリに存在しませんが、2 つのコマンドが同じトランザクションの一部であるため、このコマンドは成功します。
次のコマンドは、トランザクションをコミットします。 トランザクションがロールバックされた場合、トランザクションはすべてのサブスクライバーに対してロールバックされます。
Complete-Transaction
Get-Transaction
コマンドは、トランザクション オブジェクトのサブスクライバー数は 1 ですが、Status の値はアクティブ (コミットされていません) であることを示します。
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
トランザクションのコミットを完了するには、2 つ目の Complete- Transaction コマンドを入力します。 マルチサブスクライバー トランザクションをコミットするには、Complete-Transaction
コマンドごとに 1 つのStart-Transaction
コマンドを入力する必要があります。
Complete-Transaction
別の Get-Transaction
コマンドは、トランザクションがコミットされたことを示しています。
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 0 Committed
例 9: 独立したトランザクションの管理
別のトランザクションの進行中にトランザクションを開始する場合は、の Start-Transaction
パラメーターを使用して、新しいトランザクションを元のトランザクションから独立させることができます。
その場合、 Start-Transaction
は新しいトランザクション オブジェクトを作成し、新しいトランザクションをアクティブなトランザクションにします。
まず、 HKCU:\Software
キーでトランザクションを開始します。
Start-Transaction
次のコマンドでは、 Get-Transaction
コマンドを使用してアクティブなトランザクションを取得します。
Get-Transaction
結果には、アクティブなトランザクションを表すオブジェクトが表示されます。
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
次のコマンドは、MyCompany レジストリ キーをトランザクションの一部として追加します。 UseTransaction パラメーター (usetx) を使用して、アクティブなトランザクションにコマンドを含めます。
New-Item MyCompany -use
次のコマンドは、新しいトランザクションを開始します。 このコマンドは、独立パラメーターを使用して、このトランザクションがアクティブなトランザクションのサブスクライバーではないことを示します。
Start-Transaction -Independent
独立したトランザクションを作成すると、新しい (最近作成された) トランザクションがアクティブなトランザクションになります。
Get-Transaction
コマンドを使用して、アクティブなトランザクションを取得できます。
Get-Transaction
トランザクションの SubscriberCount は 1 であり、他のサブスクライバーがなく、トランザクションが新規であることを示します。
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
元のトランザクションを管理するには、新しいトランザクションを完了 (コミットまたはロールバック) する必要があります。
次のコマンドは、MyOtherCompany キーをレジストリに追加します。 UseTransaction パラメーター (usetx) を使用して、アクティブなトランザクションにコマンドを含めます。
New-Item MyOtherCompany -usetx
次に、トランザクションをロールバックします。 サブスクライバーが 2 つのトランザクションが 1 つある場合、トランザクションをロールバックすると、すべてのサブスクライバーのトランザクション全体がロールバックされます。
ただし、これらのトランザクションは独立しているため、最新のトランザクションをロールバックすると、レジストリの変更が取り消され、元のトランザクションがアクティブなトランザクションになります。
Undo-Transaction
Get-Transaction
コマンドは、元のトランザクションがまだセッションでアクティブであることを確認します。
Get-Transaction
RollbackPreference SubscriberCount Status
------------------ --------------- ------
Error 1 Active
次のコマンドは、アクティブなトランザクションをコミットします。
Complete-Transaction
Get-ChildItem
コマンドは、レジストリが変更されたことを示します。
dir m*
Hive: HKEY_CURRENT_USER\Software
SKC VC Name Property
--- -- ---- --------
83 1 Microsoft {(default)}
0 0 MyCompany {}
関連項目
PowerShell