启动事务。
语法
Start-Transaction [-Independent] [-RollbackPreference {<Error> | <TerminatingError> | <Never>}] [-Timeout <int>] [-Confirm] [-WhatIf] [<CommonParameters>]
说明
Start-Transaction cmdlet 启动事务,事务是作为一个单元进行管理的一系列命令。事务的状态可以是已完成(“已提交”),也可以是已完全撤消(“已回滚”),以便将由事务更改的所有数据还原为其原始状态。由于事务中的命令作为一个单元进行管理,因此所有命令不是全部提交就是全部回滚。
默认情况下,如果事务中的任何命令发生错误,事务都会自动回滚,但您可以使用 RollbackPreference 参数更改此行为。
事务中使用的 cmdlet 必须设计为支持事务。支持事务的 cmdlet 具有 UseTransaction 参数。要通过提供程序执行事务,该提供程序必须支持事务。Windows Vista 以及 Windows 更高版本中的 Windows PowerShell Registry 提供程序支持事务。在支持 Windows PowerShell 的任意版本的 Windows 上,也可以使用 Microsoft.PowerShell.Commands.Management.TransactedString 类在事务中包含表达式。其他 Windows PowerShell 提供程序也可以支持事务。
一次只能有一个事务处于活动状态。如果您在事务正在进行(既未完成也未撤消)时启动一个新的独立事务,则新事务将成为活动事务,您必须先提交或回滚新事务,然后才能对原来的事务进行任何更改。
Start-Transaction cmdlet 是 Windows PowerShell 中支持事务功能的一组 cmdlet 之一。有关详细信息,请参阅 about_Transactions。
参数
-Independent
启动一个独立于任何正在执行的事务的事务。默认情况下,如果您在另一个事务正在执行时使用 Start-Transaction,则会向正在执行的事务添加一个新的订阅者。仅当会话中已经在执行某项事务时,此参数才有效。
默认情况下,如果您在事务正在执行时使用 Start-Transaction,则将重用现有事务对象,并且订阅者计数将会递增。这与加入原来事务的效果非常类似。Undo-Transaction 命令用于回滚整个事务。要完成事务,您必须为每个订阅者输入一个 Complete-Transaction 命令。因为同时执行的多数事务都是相关的,所以默认设置可满足大多数用途的要求。
如果使用 Independent 参数,则将创建一个新事务,它可以在不影响原事务的情况下完成或撤消。但是,由于一次只能有一个事务处于活动状态,因此必须完成或回滚新事务,然后才能继续处理原来的事务。
是否为必需? |
false |
位置? |
named |
默认值 |
Reuse the original transaction object. |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-RollbackPreference <RollbackSeverity>
指定自动回滚事务的条件。默认值为“Error”。
有效值包括:
-- Error:当发生终止错误或非终止错误时,自动回滚事务。“Error”是默认值。
-- Terminating error:当发生终止错误时,自动回滚事务。
-- Never:从不自动回滚事务。
是否为必需? |
false |
位置? |
named |
默认值 |
Error |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Timeout <int>
指定事务处于活动状态的最长时间,以分钟为单位。当该超时到期时,将自动回滚事务。
默认情况下,在命令行启动的事务没有超时值。如果事务由脚本启动,则默认超时值为 30 分钟。
是否为必需? |
false |
位置? |
named |
默认值 |
No timeout (infinite) |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Confirm
在执行命令之前提示您进行确认。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-WhatIf
描述如果执行该命令会发生什么情况(无需实际执行该命令)。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
<CommonParameters>
此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.
输入和输出
输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。
输入 |
None 不能通过管道将输入传递给此 cmdlet。 |
输出 |
None 此 cmdlet 将不产生任何输出。 |
示例 1
C:\PS>cd hkcu:\software PS HKCU:\software> start-transaction PS HKCU:\software> new-item MyCompany -UseTransaction PS HKCU:\software> new-itemproperty MyCompany -name MyKey -value 123 -UseTransaction PS HKCU:\software> undo-transaction 说明 ----------- 这些命令先启动事务,然后回滚事务。由于回滚了事务,因此未对注册表进行更改。
示例 2
C:\PS>cd hkcu:\software PS HKCU:\software> start-transaction PS HKCU:\software> new-item MyCompany -UseTransaction PS HKCU:\software> new-itemproperty MyCompany -name MyKey -value 123 -UseTransaction PS HKCU:\software> complete-transaction 说明 ----------- 这些命令先启动事务,然后完成事务。在使用 Complete-Transaction 命令之前,不会对注册表进行任何更改。
示例 3
C:\PS>cd HKCU:\software PS HKCU:\software> start-transaction PS HKCU:\software> new-item -path NoPath -name MyCompany -UseTransaction PS HKCU:\software> new-item -path . -name MyCompany -UseTransaction PS HKCU:\software> start-transaction -RollbackPreference never PS HKCU:\software> new-item -path NoPath -name MyCompany -UseTransaction PS HKCU:\software> new-item -path . -name MyCompany -UseTransaction # Start-Transaction (-rollbackpreference error) PS HKCU:\software> start-transaction PS HKCU:\software> new-item -path NoPath -Name MyCompany -UseTransaction New-Item : The registry key at the specified path does not exist. At line:1 char:9 + new-item <<<< -path NoPath -Name MyCompany -UseTransaction PS HKCU:\software> new-item -path . -name MyCompany -UseTransaction New-Item : Cannot use transaction. The transaction has been rolled back or has timed out. At line:1 char:9 + new-item <<<< -path . -name MyCompany -UseTransaction # Start-Transaction (-rollbackpreference never) PS HKCU:\software> start-transaction -RollbackPreference never PS HKCU:\software> new-item -path NoPath -name MyCompany -UseTransaction New-Item : The registry key at the specified path does not exist. At line:1 char:9 + new-item <<<< -path NoPath -name MyCompany -UseTransaction PS HKCU:\software> new-item -path . -name MyCompany -UseTransaction Hive: HKEY_CURRENT_USER\Software SKC VC Name Property --- -- ---- -------- 0 0 MyCompany {} PS HKCU:\Software> complete-transaction # Succeeds 说明 ----------- 此示例演示了更改 RollbackPreference 参数值的效果。 在第一组命令中,Start-Transaction 命令未使用 RollbackPreference 参数。因此使用了默认值(“Error”)。当事务命令中发生错误(指定路径不存在)时,自动回滚事务。 在第二组命令中,Start-Transaction 命令使用值为“Never”的 RollbackPreference 参数。因此当事务命令发生错误时,事务仍处于活动状态并且可以成功完成。 由于大多数事务都必须在没有错误的情况下执行,因此 RollbackPreference 参数的默认值通常是首选的。
示例 4
C:\PS>cd HKCU:\software PS HKCU:\software> start-transaction PS HKCU:\software> new-item MyCompany -UseTransaction PS HKCU:\software> start-transaction PS HKCU:\software> get-transaction PS HKCU:\software> new-item MyCompany2 -UseTransaction PS HKCU:\software> complete-transaction PS HKCU:\software> complete-transaction PS HKCU:\Software> Get-Transaction RollbackPreference SubscriberCount Status ------------------ --------------- ------ Error 2 Active 说明 ----------- 此示例演示了当事务正在执行时使用 Start-Transaction 命令的效果。这与加入正在执行的事务的效果非常类似。 虽然这是一个简化的命令,但当事务涉及到运行包含完整事务的脚本时,通常会发生这种情况。 第一个 Start-Transaction 命令启动事务。第一个 New-Item 命令包含在该事务中。 第二个 Start-Transaction 命令向该事务添加新的订阅者。此时 Get-Transaction 命令返回一个其订阅者计数为 2 的事务。第二个 New-Item 命令也包含在该同一事务中。 在整个事务完成之前,不会对注册表进行任何更改。要完成事务,您必须输入两个 Complete-Transaction 命令,为每个订阅者分别输入一次。如果要在任意时刻回滚事务,则会对这两个订阅者回滚整个事务。
示例 5
C:\PS>cd HKCU:\software PS HKCU:\software> start-transaction PS HKCU:\software> new-item MyCompany -UseTransaction PS HKCU:\software> start-transaction -independent PS HKCU:\software> get-transaction PS HKCU:\software> undo-transaction PS HKCU:\software> new-itemproperty -path MyCompany -name MyKey -value 123 -UseTransaction PS HKCU:\software> complete-transaction PS HKCU:\software> dir my* PS HKCU:\Software> get-transaction RollbackPreference SubscriberCount Status ------------------ --------------- ------ Error 1 Active PS HKCU:\software> undo-transaction PS HKCU:\software> new-itemproperty -path MyCompany -name MyKey -value 123 -UseTransaction MyKey ----- 123 PS HKCU:\software> complete-transaction PS HKCU:\software> dir my* Hive: HKEY_CURRENT_USER\Software SKC VC Name Property --- -- ---- -------- 0 1 MyCompany {MyKey} 说明 ----------- 此示例演示了当某一事务正在执行时,使用 Start-Transaction 的 Independent 参数启动另一个事务的效果。在本例中,将回滚新事务,而不影响原来的事务。 虽然事务在逻辑上是独立的,但由于一次只能有一个事务处于活动状态,因此您必须回滚或提交最新事务,然后才能继续处理原来的事务。 第一组命令启动一个事务。New-Item 命令包含在第一个事务中。 在第二组命令中,Start-Transaction 命令使用 Independent 参数。随后的 Get-Transaction 命令显示活动事务(最新事务)的事务对象。订阅者计数等于 1,表明这两个事务不相关。 当使用 Undo-Transaction 命令回滚活动事务后,原来的事务将恢复为活动状态。 包含在原来事务中的 New-ItemProperty 命令正常完成(未发生错误),并且可以通过使用 Complete-Transaction 命令来完成原来的事务。因此注册表会发生更改。
示例 6
C:\PS>cd hkcu:\software PS HKCU:\software> start-transaction PS HKCU:\software> new-item MyCompany1 -UseTransaction PS HKCU:\software> new-item MyCompany2 PS HKCU:\software> new-item MyCompany3 -UseTransaction PS HKCU:\software> dir my* PS HKCU:\software> complete-transaction PS HKCU:\software> dir my* PS HKCU:\Software> dir my* Hive: HKEY_CURRENT_USER\Software SKC VC Name Property --- -- ---- -------- 0 0 MyCompany2 {} PS HKCU:\Software> complete-transaction PS HKCU:\Software> dir my* Hive: HKEY_CURRENT_USER\Software SKC VC Name Property --- -- ---- -------- 0 0 MyCompany1 {} 0 0 MyCompany2 {} 0 0 MyCompany3 {} 说明 ----------- 此示例演示了在事务正在执行时提交的命令可以包含在事务中,也可以不包含在事务中。只有使用 UseTransaction 参数的命令才包含在事务中。 第一个和第三个 New-Item 命令使用 UseTransaction 参数。这两个命令都包含在事务中。因为第二个 New-Item 命令未使用 UseTransaction 参数,所以它未包含在事务中。 第一个“dir”命令显示结果。第二个 New-Item 命令将立即完成,而第一个和第三个 New-Item 命令直到事务提交后才生效。 Complete-Transaction 命令提交事务。因此,第二个“dir”命令显示添加到注册表中的所有新项。
示例 7
C:\PS>start-transaction -timeout 2 # Wait two minutes... C:\PS> get-transaction C:\PS> new-item HKCU:\Software\MyCompany -UseTransaction C:\PS> start-transaction -timeout 2 # Wait two minutes... C:\PS>> get-transaction RollbackPreference SubscriberCount Status ------------------ --------------- ----------- Error 1 RolledBack C:\PS> new-item HKCU:\Software\MyCompany -UseTransaction New-Item : Cannot use transaction. The transaction has been rolled back or has timed out. At line:1 char:9 + new-item <<<< MyCompany -UseTransaction 说明 ----------- 此命令使用 Start-Transaction 的 Timeout 参数启动必须在两分钟内完成的事务。如果事务未在该超时期限内完成,则将自动回滚。 当该超时到期时,您不会收到通知,但事务对象的 Status 属性将设置为 RolledBack,并且使用 UseTransaction 参数的命令将失败。
另请参阅