關於交易
簡短描述
描述如何在PowerShell中管理交易的作業。
詳細描述
PowerShell 從 PowerShell 2.0 開始支援交易。 此功能可讓您啟動交易、指出哪些命令是交易的一部分,以及認可或回復交易。
關於交易
在 PowerShell 中,交易是一組一或多個以邏輯單元方式管理的命令。 交易可以完成 (「認可」) ,這會變更受交易影響的數據。 或者,交易可以完全復原 (「回復」) ,讓受影響的數據不會由交易變更。
因為交易中的命令是以單位來管理,所以會認可所有命令,或復原所有命令。
交易廣泛用於數據處理,最值得注意的是資料庫作業和財務交易。 當一組命令的最差案例不是它們全都失敗,但有些命令成功,而其他命令失敗,讓系統處於難以修復的損毀、false 或無法解譯的狀態時,最常使用交易。
TRANSACTION CMDLET
PowerShell 包含數個專為管理交易而設計的 Cmdlet。
- Start-Transaction:啟動新的交易。
- Use-Transaction:將命令或表達式新增至交易。 命令必須使用啟用交易的物件。
- 復原交易:回復交易,讓交易不會變更任何數據。
- 完整交易:認可交易。 受交易影響的數據會變更。
- Get-Transaction:取得使用中交易的相關信息。
如需交易 Cmdlet 的清單,請輸入:
get-command *transaction
如需 Cmdlet 的詳細資訊,請輸入:
get-help use-transaction -detailed
啟用交易的專案
若要參與交易,Cmdlet 和提供者都必須支援交易。 這項功能內建於受交易影響的物件中。
PowerShell 登錄提供者支援 Windows Vista 中的交易。 (Microsoft.PowerShell.Commands.Management.TransactedString) TransactedString 物件可與任何執行 PowerShell 的操作系統搭配運作。
其他 PowerShell 提供者可以支援交易。 若要在支援交易的會話中尋找 PowerShell 提供者,請使用下列命令在提供者的 Capabilities 屬性中尋找 「Transactions」 值:
get-psprovider | where {$_.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。
TRANSACTION 物件
交易會以交易物件 System.Management.Automation.Transaction 在 PowerShell 中表示。
此物件具有下列屬性:
RollbackPreference:包含目前交易的復原喜好設定。 當您使用 Start-Transaction 來啟動交易時,可以設定復原喜好設定。
回復喜好設定會決定自動回復交易的條件。 有效值為 Error、TerminatingError 和 Never。 預設值為 Error。
狀態:包含交易的目前狀態。 有效值為 Active、Committed 和 RolledBack。
SubscriberCount:包含交易的訂閱者數目。 當您在另一個交易進行時啟動交易時,訂閱者會新增至交易。 訂閱者認可交易時,訂閱者計數會遞減。
作用中交易
在 PowerShell 中,一次只有一個交易作用中,而且您只能管理作用中的交易。 同一個會話中可以同時進行多個交易,但只有最近啟動的交易處於作用中狀態。
因此,您無法在使用交易 Cmdlet 時指定特定交易。 命令一律會套用至使用中的交易。
這在 Get-Transaction Cmdlet 的行為中最為明顯。 當您輸入 Get-Transaction 命令時,Get-Transaction 一律只會取得一個交易物件。 這個物件是代表使用中交易的物件。
若要管理不同的交易,您必須先認可或回復使用中交易,以完成使用中交易。 當您這樣做時,先前的交易會自動變成作用中。 交易會以啟動的順序反轉變成作用中,因此最近啟動的交易一律為作用中。
訂閱者和獨立交易
如果您在進行另一筆交易時啟動交易,根據預設,PowerShell 不會啟動新的交易。 相反地,它會將「訂閱者」新增至目前的交易。
當交易有多個訂閱者時,任何時間點的單一 Undo-Transaction 命令都會回復所有訂閱者的整個交易。 不過,若要認可交易,您必須為每個訂閱者輸入 Complete-Transaction 命令。
若要尋找交易的訂閱者數目,請檢查交易物件的 SubscriberCount 屬性。 例如,下列命令會使用 Get-Transaction Cmdlet 來取得使用中交易的 SubscriberCount 屬性值:
(Get-Transaction).SubscriberCount
新增訂閱者是預設行為,因為當另一個交易進行中時啟動的大部分交易都與原始交易相關。 在一般模型中,包含交易的腳本會呼叫包含其本身交易的協助程式腳本。 由於交易相關,因此應該回復或認可為一個單位。
不過,您可以使用 Start-Transaction Cmdlet 的 Independent 參數,啟動與目前交易無關的交易。
當您啟動獨立交易時,Start-Transaction 會建立新的交易物件,而新交易會變成作用中的交易。 獨立交易可以認可或回復,而不會影響原始交易。
當獨立交易完成 (認可或回復) 時,原始交易會再次變成作用中交易。
變更數據
當您使用交易來變更數據時,在您認可交易之前,受交易影響的數據不會變更。 不過,不屬於交易一部分的命令可以變更相同的數據。
當您使用交易來管理共享數據時,請記住這點。 一般而言,資料庫有一些機制可在您處理數據時鎖定數據,防止其他使用者和其他命令、腳本和函式變更數據。
不過,鎖定是資料庫的一項功能。 它與交易無關。 如果您是在啟用交易的文件系統或其他數據存放區中工作,則在交易進行時可以變更數據。
範例
本節中的範例會使用 PowerShell 登錄提供者,並假設您已熟悉它。 如需登錄提供者的相關信息,請輸入 「get-help registry」。。
範例 1:認可交易
若要建立交易,請使用 Start-Transaction Cmdlet。 下列命令會使用預設設定來啟動交易。
start-transaction
若要在交易中包含命令,請使用 Cmdlet 的 UseTransaction 參數。 根據預設,命令不會包含在交易中,
例如,下列命令會在 HKCU: 磁碟驅動器的軟體金鑰中設定目前的位置,不會包含在交易中。
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
若要取得目前在登錄中的專案,請使用不含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:結合 TRANSACTED 和非交易命令
您可以在交易期間輸入非交易命令。 非交易的命令會立即影響數據,但不會影響交易。 下列命令會在 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 參數來變更喜好設定。
下列命令會以 「永不」的復原喜好設定來啟動交易。
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
輸出會顯示交易檢視。
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
若要完成認可交易,請輸入第二個 Complete- Transaction 命令。 若要認可多訂閱者交易,您必須為每個 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 {}