共用方式為


about_Transactions

簡短描述

描述如何在PowerShell中管理交易作業。

詳細描述

PowerShell 從 PowerShell 2.0 開始支援交易。 這項功能可讓您啟動交易、指出哪些命令是交易的一部分,以及認可或回復交易。

在 PowerShell 中,交易是一組一或多個以邏輯單元方式管理的命令。 交易可以完成 (“committed”),這會變更受交易影響的數據。 或者,交易可以完全復原(「回復」),讓受影響的數據不會由交易變更。

由於交易中的命令會以單位方式管理,因此會認可所有命令,或復原所有命令。

交易在數據處理中廣泛使用,尤其是資料庫作業和財務交易。 當一組命令最糟糕的情況不是它們全部失敗,而是某些命令成功,而其他命令失敗時,交易最常使用,讓系統處於難以修復的損毀、false 或無法解譯的狀態。

交易 Cmdlet

PowerShell 包含數個專為管理交易而設計的 Cmdlet。

  • Start-Transaction:啟動新的交易。
  • Use-Transaction:將命令或表達式新增至交易。 命令必須使用啟用交易的物件。
  • Undo-Transaction:回復交易,讓交易不會變更任何數據。
  • Complete-Transaction:認可交易。 交易影響的數據會變更。
  • Get-Transaction:取得使用中交易的相關信息。

如需交易 Cmdlet 的清單,請輸入:

Get-Command *transaction

如需 Cmdlet 的詳細資訊,請輸入:

Get-Help Use-Transaction -Detailed

啟用交易的專案

若要參與交易,Cmdlet 和提供者都必須支援交易。 這項功能內建於受交易影響的物件中。

PowerShell 登錄提供者支援 Windows 中的交易。 TransactedString 物件可與任何執行 PowerShell 的作業系統搭配運作。

其他 PowerShell 提供者可以支援交易。 若要在您的工作階段中尋找支援交易的 PowerShell 提供者,請使用下列命令來尋找提供者的 Capabilities 屬性中的 Transactions 值:

Get-PSProvider | Where-Object {$_.Capabilities -like "*transactions*"}

如需提供者的詳細資訊,請參閱提供者的說明。 若要取得提供者說明,請輸入:

Get-Help <provider-name>

例如,若要取得登錄提供者的說明,請輸入:

Get-Help registry

UseTransaction 參數

可支援交易的 Cmdlet 具有 UseTransaction 參數。 此參數會在使用中交易中包含 命令。 您可以使用完整的參數名稱或其別名 usetx

只有在會話包含使用中交易時,才能使用 參數。 如果您在沒有使用中交易時,使用UseTransaction 參數輸入命令,則命令會失敗。

若要使用UseTransaction 參數尋找 Cmdlet,請輸入:

Get-Help * -Parameter UseTransaction

在 PowerShell 核心中,所有設計來與 PowerShell 提供者搭配運作的 Cmdlet 都支援交易。 因此,您可以使用提供者 Cmdlet 來管理交易。

如需 PowerShell 提供者的詳細資訊,請參閱 about_Providers

交易物件

交易是以交易物件 System.Management.Automation.Transaction 表示在 PowerShell 中。

物件具有下列屬性:

  • RollbackPreference:包含目前交易的回復喜好設定。 您可以使用 來啟動交易時 Start-Transaction 設定復原喜好設定。

    回復喜好設定會決定自動回復交易的條件。 有效值為 ErrorTerminatingErrorNever。 預設值是 Error

  • 狀態:包含交易的目前狀態。 有效值為 ActiveCommittedRolledBack

  • SubscriberCount:包含交易的訂閱者數目。 當您在另一筆交易進行時啟動交易時,就會將訂閱者新增至交易。 訂閱者認可交易時,訂閱者計數會遞減。

使用中交易

在 PowerShell 中,一次只有一個交易作用中,而且您只能管理作用中的交易。 同一個會話中可以同時進行多個交易,但只有最近啟動的交易處於作用中狀態。

因此,您無法在使用交易 Cmdlet 時指定特定交易。 命令一律會套用至使用中的交易。

這在 Cmdlet 的行為 Get-Transaction 中最為明顯。 當您輸入 Get-Transaction 命令時, Get-Transaction 一律只會取得一個交易物件。 這個物件是代表使用中交易的物件。

若要管理不同的交易,您必須先認可或回復使用中交易,才能完成作用中交易。 當您這樣做時,先前的交易會自動變成作用中。 交易會依啟動的順序變成作用中,讓最近啟動的交易一律處於作用中狀態。

訂閱者和獨立交易

如果您在另一個交易進行中時啟動交易,根據預設,PowerShell 不會啟動新的交易。 相反地,它會將「訂閱者」新增至目前的交易。

當交易有多個訂閱者時,任何時間點的單 Undo-Transaction 一命令都會回復所有訂閱者的整個交易。 不過,若要認可交易,您必須為每個訂閱者輸入 Complete-Transaction 命令。

若要尋找交易的訂閱者數目,請檢查交易物件的 SubscriberCount 屬性。 例如,下列命令會使用 Get-Transaction Cmdlet 來取得使用中交易的 SubscriberCount 屬性值:

(Get-Transaction).SubscriberCount

新增訂閱者是預設行為,因為當另一個交易進行時啟動的大部分交易都與原始交易相關。 在一般模型中,包含交易的腳本會呼叫包含其本身交易的協助程式腳本。 由於交易相關,因此應該以單位的形式回復或認可它們。

不過,您可以使用 Cmdlet 的 Independent 參數,啟動與目前交易無關的交易 Start-Transaction

當您啟動獨立交易時, Start-Transaction 會建立新的交易物件,而新的交易會變成使用中交易。 獨立交易可以認可或回復,而不會影響原始交易。

當獨立交易完成時(已認可或回復),原始交易會再次變成使用中交易。

變更數據

當您使用交易來變更數據時,在您認可交易之前,不會變更受交易影響的數據。 不過,不屬於交易的命令可以變更相同的數據。

當您使用交易來管理共享數據時,請記住這點。 一般而言,資料庫具有在處理數據時鎖定數據的機制,以防止其他使用者和其他命令、腳本和函式變更數據。

不過,鎖定是資料庫的一項功能。 這與交易無關。 如果您正在交易啟用的檔案系統或其他數據存放區中工作,則在交易進行時可以變更數據。

範例

本節中的範例會使用 PowerShell 登錄提供者,並假設您已熟悉它。 如需登入提供者的相關資訊,請輸入 Get-Help registry

範例 1:認可交易

若要建立交易,請使用 Start-Transaction Cmdlet。 下列命令會使用預設設定啟動交易。

Start-Transaction

若要在交易中包含命令,請使用 Cmdlet 的 UseTransaction 參數。 根據預設,交易中不會包含命令,

例如,下列命令會設定磁碟驅動器軟體密鑰 HKCU: 中的目前位置,不會包含在交易中。

cd hkcu:\Software

下列會建立 MyCompany 金鑰的命令會使用 Cmdlet 的 New-Item UseTransaction 參數,將命令包含在使用中交易中。

New-Item MyCompany -UseTransaction

此命令會傳回代表新機碼的物件,但由於命令是交易的一部分,因此登錄尚未變更。

Hive: HKEY_CURRENT_USER\Software

SKC  VC Name                           Property
---  -- ----                           --------
  0   0 MyCompany                      {}

若要認可交易,請使用 Complete-Transaction Cmdlet。 因為它一律會影響使用中的交易,所以您無法指定交易。

Complete-Transaction

因此,金鑰 MyCompany 會新增至登錄。

dir m*
Hive: HKEY_CURRENT_USER\software

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

範例 2:回復交易

若要建立交易,請使用 Start-Transaction Cmdlet。 下列命令會使用預設設定啟動交易。

Start-Transaction

下列命令會建立 MyOtherCompany 機碼,使用 Cmdlet 的 New-Item UseTransaction 參數,將命令包含在使用中交易中。

New-Item MyOtherCompany -UseTransaction

此命令會傳回代表新機碼的物件,但由於命令是交易的一部分,因此登錄尚未變更。

Hive: HKEY_CURRENT_USER\Software

SKC  VC Name                           Property
---  -- ----                           --------
  0   0 MyOtherCompany                 {}

若要復原交易,請使用 Undo-Transaction Cmdlet。 因為它一律會影響使用中的交易,所以您不會指定交易。

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 使用 Cmdlet 將登錄專案新增 MyKey 至 MyCompany 機碼。 此命令會使用UseTransaction 參數,在交易中包含命令。

New-Itemproperty -path MyCompany -Name MyKey -value 123 -UseTransaction

命令會傳回代表新登錄項目的物件,但登錄專案不會變更。

MyKey
-----
123

若要取得目前在登錄中的專案,請使用 Get-ChildItem 不含UseTransaction 參數的命令 (dir)。 下列命令會取得以 「M」 開頭的專案。

dir m*

結果顯示尚未將任何專案新增至 MyCompany 索引鍵。

Hive: HKEY_CURRENT_USER\Software

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

若要預覽認可交易的效果,請使用UseTransaction 參數輸入 (Get-ChildItemdir) 命令。 此命令具有交易內數據的檢視。

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

接下來的三個命令會使用 New-Item Cmdlet 將機碼新增至登錄。 第一個和第三個命令會使用UseTransaction 參數,在交易中包含命令。 第二個命令會省略 參數。 因為第二個命令未包含在交易中,所以會立即生效。

New-Item MyCompany1 -UseTransaction
New-Item MyCompany2
New-Item MyCompany3 -UseTransaction

若要檢視登錄的目前狀態,請使用 Get-ChildItem 不含UseTransaction參數的 (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 使用 Cmdlet 將機碼新增 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 RollbackPreference 參數來變更喜好設定。

下列命令會啟動具有 復原喜好設定的交易 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 Cmdlet

Cmdlet 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 方法來新增文字,但它會將文字新增為交易的一部分。 命令會以大括弧括住,並且設定為的 ScriptBlock 參數Use-Transaction需要UseTransaction 參數 (usetx)。

Use-Transaction {$t.append(" PowerShell")} -usetx

若要查看 中$t交易字串的目前內容,請使用 ToString TransactedString 物件的 方法

$t.tostring()

輸出顯示只有未交易的變更有效。

Windows

若要查看交易中$t中交易字串的目前內容,請在命令中 Use-Transaction 內嵌表達式。

Use-Transaction {$t.tostring()} -usetx

輸出會顯示交易檢視。

PowerShell

下列命令會認可交易。

Complete-Transaction

若要檢視最終字串:

$t.tostring()
PowerShell

範例 8:管理多訂閱者交易

當您在另一筆交易進行時啟動交易時,PowerShell 預設不會建立第二筆交易。 相反地,它會將訂閱者新增至目前的交易。

此範例示範如何檢視和管理多訂閱者交易。

首先,在索引鍵中 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 使用 Cmdlet 將 MyKey 登錄專案新增至 MyCompany 機碼。 它會使用UseTransaction 參數在交易中包含 命令。

New-ItemProperty -path MyCompany -name MyKey -UseTransaction

MyCompany 機碼不存在於登錄中,但此命令會成功,因為這兩個命令是相同交易的一部分。

下列命令會認可交易。 如果交易回復,則會回復所有訂閱者的交易。

Complete-Transaction

命令 Get-Transaction 顯示交易物件上的訂閱者計數為 1,但 Status 的值仍為作用中 (未認可)。

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

若要完成認可交易,請輸入第二個完成交易命令。 若要認可多訂閱者交易,您必須為每個Start-Transaction命令輸入一個Complete-Transaction命令。

Complete-Transaction

另一個 Get-Transaction 命令顯示已認可交易。

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

範例 9:管理獨立交易

當您在另一筆交易進行時啟動交易時,您可以使用 Start-Transaction Independent 參數讓新交易與原始交易無關。

當您這麼做時, Start-Transaction 會建立新的交易物件,並將新交易變成使用中的交易。

首先,在索引鍵中 HKCU:\Software 啟動交易。

Start-Transaction

下列命令會 Get-Transaction 使用 命令來取得使用中的交易。

Get-Transaction

結果會顯示代表使用中交易的物件。

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

下列命令會將 MyCompany 登錄機碼新增為交易的一部分。 它會使用 UseTransaction 參數 (usetx) 在作用中交易中包含 命令。

New-Item MyCompany -use

下列命令會啟動新的交易。 此命令會使用 Independent 參數來指出此交易不是使用中交易的訂閱者。

Start-Transaction -Independent

當您建立獨立交易時,新的 (最近建立的) 交易會變成使用中的交易。 您可以使用 Get-Transaction 命令來取得使用中的交易。

Get-Transaction

請注意,交易的 SubscriberCount 為 1,表示沒有其他訂閱者,且交易是新的。

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

您必須先完成新交易(認可或回復),才能管理原始交易。

下列命令會將 MyOtherCompany 機碼新增至登錄。 它會使用 UseTransaction 參數 (usetx) 在作用中交易中包含 命令。

New-Item MyOtherCompany -usetx

現在,復原交易。 如果有兩個訂閱者的單一交易,回復交易會回復所有訂閱者的整個交易。

不過,由於這些交易是獨立的,因此回復最新的交易會取消登錄變更,並將原始交易設為使用中交易。

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

另請參閱