主題
    about_Transactions

簡短描述
    說明如何管理 Windows PowerShell 的交易作業。

完整描述
    從 Windows PowerShell 2.0 開始,Windows PowerShell 可支援交易。此功能可讓您開始進行
    交易、指出哪些命令為交易所屬,以及認可或復原交易。
    
    
  關於交易

      在 Windows PowerShell 中,交易是一組包含一個或多個以邏輯單元來管理的命令。交易
      可以完成 (「認可」),而這會變更受交易影響的資料。或者,交易可以完全取消 (「復
      原」),如此一來,交易就不會變更受影響的資料。

      由於任一交易中的所有命令都會視為一個單元進行管理,因此,所有命令不是全部認可、
      就是全部復原。

      交易廣泛運用在資料處理中,最常見的是用於資料庫操作及財務交易。最壞的情況不是
      一組命令全部失敗,而是部分命令成功、部分失敗,使系統停留在受損、錯誤或無法解譯
      的難以修復狀態,這就是最常使用交易的時候。

            
  交易 CMDLET

      Windows PowerShell 隨附數個專為管理交易而設計的 Cmdlet。

      Cmdlet                 描述
      --------------         ---------------------------------   
      Start-Transaction      啟動新交易。

      Use-Transaction        將命令或運算式加入至交易。命令必須使用
                             具有交易功能的物件。

      Undo-Transaction       復原交易,不讓交易變更任何資料。

      Complete-Transaction   認可交易。受交易影響的資料會變更。

      Get-Transaction        取得現用交易的相關資訊。


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

          get-command *transaction

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

	  get-help <Cmdlet 名稱> -detailed

      例如:
	
	  get-help use-transaction -detailed


  具有交易功能的元素

      若要參與交易,Cmdlet 和提供者都必須支援交易。此功能內建於受交易影響的物件中。
   
      在 Windows Vista 中,Windows PowerShell 登錄提供者支援交易。TransactedString 物件 
      (Microsoft.PowerShell.Commands.Management.TransactedString) 可搭配任何執行 
      Windows PowerShell 的作業系統使用。

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

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

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

	  get-help <提供者名稱>

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

	  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.Tra
      nsaction 表示。

      此物件具有下列屬性:

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

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

      Status:              
         包含交易目前的狀態。有效的值包括 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: 磁碟機的 Software 機碼中設定目前位置,但此命令不會包含
    在交易中。

        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。
    由於此 Cmdlet 一定會影響現用交易,因此您無法指定交易。

	complete-transaction  


    所以 MyCompany 機碼會新增至登錄。

	dir m*
       
        Hive: HKEY_CURRENT_USER\software

        SKC  VC Name                           Property
        ---  -- ----                           --------
         83   1 Microsoft                      {(預設)}
          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。
    由於此 Cmdlet 一定會影響現用交易,因此您無法指定交易。

	Undo-transaction  

    結果是 MyOtherCompany 機碼不會新增至登錄。

	dir m*
       
        Hive: HKEY_CURRENT_USER\software

        SKC  VC Name                           Property
        ---  -- ----                           --------
         83   1 Microsoft                      {(預設)}
          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                      {(預設)}
         0   0 MyCompany                      {}


    若要預覽認可交易的效果,請輸入 Get-ChildItem ("dir") 命令與 UseTransaction 參數。
    此命令可從交易內提供資料的檢視。


	dir m* -useTransaction


    結果顯示,如果交易已認可,MyKey 項目將會新增至 MyCompany 機碼。


        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
        83   1 Microsoft                      {(預設)}
         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 ("dir") 命令,但不加上 UseTransaction 
    參數。此命令會取得開頭為 "M" 的項目。

	dir m*

    結果顯示,MyCompany2 機碼會新增至登錄,屬於交易一部分的 MyCompany1 和 
    MyCompany3 機碼則不會加入。
     
        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
        83   1 Microsoft                      {(預設)}
         0   0 MyCompany2                      {}


    下列命令會認可交易。

        complete-transaction

    現在,已新增做為交易一部分的機碼會出現在登錄中。

	dir m*

     
        Hive: HKEY_CURRENT_USER\Software

        SKC  VC Name                           Property
        ---  -- ----                           --------
        83   1 Microsoft                      {(預設)}
        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:此路徑的機碼已存在於第 1 行,第 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:此路徑的機碼已存在於第 1 行,第 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                      {(預設)}
         0   0 MyCompany                      {}

請參閱
    Start-Transaction
    Get-Transaction
    Complete-Transaction
    Undo-Transaction
    Use-Transaction
    Registry (提供者)
    about_Providers
    Get-PSProvider
    Get-ChildItem

	




目錄