about_Transactions

適用於: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

主題

about_Transactions

簡短描述

描述如何管理 Windows PowerShell® 中的交易作業。

詳細描述

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

關於交易

在 Windows PowerShell 中,交易是其中以邏輯單元來管理的一或多個命令之集合。交易可以是已完成 (「認可」),它會變更受交易影響的資料。或者,交易可以是完全復原 (「回復」),這樣受影響的資料不會被交易變更。

由於交易中的命令會被視為一個單元來管理,因此,所有命令必須一起確認或一起回復。

處理資料時會廣泛地使用到交易,特別是應用在資料庫作業及金融交易。交易最常用在當一組命令並非完全失敗,而是一些命令成功但其他命令失敗的最壞案例,這會讓系統處於難以修復的 damaged、false 或 uninterpretable 狀態。

交易 CMDLET

Windows PowerShell 包含設計用於管理交易的數個 Cmdlet。

      Cmdlet                 Description
      --------------         ---------------------------------    
      Start-Transaction      Starts a new transaction. 

      Use-Transaction        Adds a command or expression to the
                             transaction. The command must use
                             transaction-enabled objects.

      Undo-Transaction       Rolls back the transaction so that
                             no data is changed by the transaction.

      Complete-Transaction   Commits the transaction. The data
                             affected by the transaction is changed.

      Get-Transaction        Gets information about the active
                             transaction.

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

          get-command *transaction

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

          get-help <cmdlet-name> -detailed

例如:

          get-help use-transaction -detailed

啟用交易的元素

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

Windows PowerShell 登錄提供者支援在 Windows Vista 中的交易。TransactedString 物件 (Microsoft.PowerShell.Commands.Management.TransactedString) 可以搭配執行 Windows PowerShell 的任何作業系統。

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

        get-psprovider | where {$_.Capabilities -like "*transactions*"}

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

        get-help <provider-name>

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

        get-help registry

USETRANSACTION 參數

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

此參數只能在工作階段包含使用中的交易時使用。如果您在沒有使用中的交易時輸入具有 UseTransaction 參數的命令,命令將會失敗。

若要尋找具有 UseTransaction 參數的 Cmdlet,請輸入:

        get-help * -parameter UseTransaction

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

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

交易物件

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

物件具有下列屬性:

RollbackPreference:

包含為目前交易設定的回復喜好設定。您可以在使用 Start-Transaction 來開始交易時設定回復喜好設定。

回復喜好設定會決定交易自動回復的條件。有效值為 Error、TerminatingError 和 Never。預設值為 Error。

狀態:

包含交易的目前狀態。有效值為 Active、Committed 和 RolledBack。

SubscriberCount:

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

使用中交易

在 Windows PowerShell 中,一次只有一筆交易是使用中,您只能管理使用中的交易。在相同時間、相同工作階段中可以進行多筆交易,但是只有最近啟動的交易是使用中。

如此一來,當您使用交易 Cmdlet 時無法指定特定交易。命令一律會套用到使用中的交易。

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

若要管理不同的交易,您必須先藉由認可或回復來完成使用中的交易。當您這麼做時,先前的交易會自動變成使用中。交易會以啟動的相反順序變成使用中,如此最近啟動的交易一律是使用中。

訂閱者和獨立交易

如果您在另一筆交易進行時啟動交易,根據預設,Windows PowerShell 不會啟動新交易。而是將它新增至目前的交易。

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

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

          (Get-Transaction).SubscriberCount

新增訂閱者是預設行為,因為在另一筆交易進行時所啟動多數交易是與原始交易相關。在一般模型中,包含交易的指令碼會呼叫協助程式指令碼,其中包含它自己的交易。因為交易是相關的,所以它們應該回復或認可為一個單元。在這裡插入區段內文。

不過,您可以使用 Start-Transaction Cmdlet 的 Independent 參數,來啟動獨立於目前交易的交易。

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

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

變更資料

當您使用交易來變更資料時,直到認可交易為止,將不會變更受交易影響的資料。不過,不是交易一部分的命令可以變更相同的資料。

當您使用交易來管理共用的資料時,請記住這點。一般而言,資料庫對於您正在使用的資料都有鎖定的機制,防止其他使用者和其他命令、指令碼和函式變更它。

不過,鎖定是資料庫的功能。它與交易不相關。如果您是在啟用交易的檔案系統或其他資料存放區中作業,就可以在交易進行時變更資料。

範例

本節中的範例使用 Windows PowerShell 登錄提供者並假設您已熟悉它。如需登錄提供者的詳細資訊,請輸入 "get-help registry"。

範例 1:認可交易

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

        start-transaction

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

例如,在 HKCU: drive 的軟體機碼中設定目前位置的下列命令,並不包含在交易中。

        cd hkcu:\Software

建立 MyCompany 機碼的下列命令會使用 New-Item Cmdlet 的 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 機碼的下列命令,會使用 New-Item Cmdlet 的 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 命令 ("dir") 而不使用 UseTransaction 參數。下列命令會取得開頭為 "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

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

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

Use-Transaction Cmdlet 可讓您針對啟用交易的 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 的 ScriptBlock 參數的值。UseTransaction 參數 (UseTx) 是必要的。

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

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

        $t.tostring()

輸出顯示只有非交易的變更才會生效。

        Windows

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

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

輸出會顯示交易檢視。

        Windows PowerShell

下列命令會認可交易。

        complete-transaction

若要查看最後一個字串:

        $t.tostring()

        Windows PowerShell

範例 7:管理多個訂閱者的交易

當您在另一筆交易進行時啟動交易,依預設 Windows 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 的值仍然是 Active (不是 Committed)。

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

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

        complete-transaction

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

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

範例 8:管理獨立的交易

當您在另一筆交易進行時啟動交易,您可以使用 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                      {}

另請參閱

Start-Transaction

Get-Transaction

Complete-Transaction

Undo-Transaction

Use-Transaction

登錄 (提供者)

about_Providers

Get-PSProvider

Get-ChildItem