Start-Transaction

启动事务。

语法

Start-Transaction
     [-Timeout <Int32>]
     [-Independent]
     [-RollbackPreference <RollbackSeverity>]
     [-WhatIf]
     [-Confirm]
     [<CommonParameters>]

说明

Start-Transaction cmdlet 启动一个事务,该事务是作为一个单元管理的一系列命令。 事务可以完成或提交。 或者,它可以完全撤消或回滚,以便事务更改的任何数据还原到其原始状态。 由于事务中的命令作为一个单元进行管理,因此所有命令不是全部提交就是全部回滚。

默认情况下,如果事务中的任何命令生成错误,则事务会自动回滚。 可以使用 RollbackPreference 参数更改此行为。

事务中使用的 cmdlet 必须设计为支持事务。 支持事务的 Cmdlet 具有 UseTransaction 参数。 若要通过提供程序执行事务,则该提供程序必须支持事务。 Windows Vista 和更高版本的 Windows 操作系统中的 Windows PowerShell 注册表提供程序支持事务。 还可以使用 Microsoft.PowerShell.Commands.Management.TransactedString 类在支持Windows PowerShell的任何 Windows 系统上的事务中包含表达式。 其他 Windows PowerShell 提供程序也可以支持事务。

一次只能有一个事务处于活动状态。 如果在事务正在进行时启动新的独立事务,则新事务将成为活动事务,并且必须在对原始事务进行任何更改之前提交或回滚新事务。

Start-Transaction cmdlet 是支持 Windows PowerShell 中的事务功能的一组 cmdlet 之一。 有关详细信息,请参阅 about_Transactions。

示例

示例 1:启动和回滚事务

PS C:\> cd hkcu:\software
PS HKCU:\software> Start-Transaction
PS HKCU:\software> New-Item "ContosoCompany" -UseTransaction
PS HKCU:\software> New-ItemProperty "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
PS HKCU:\software> Undo-Transaction

这些命令先启动事务,然后回滚事务。 由于回滚了事务,因此未对注册表进行更改。

示例 2:启动并完成事务

PS C:\> cd hkcu:\software
PS HKCU:\software> Start-Transaction
PS HKCU:\software> New-Item "ContosoCompany" -UseTransaction
PS HKCU:\software> New-ItemProperty "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
PS HKCU:\software> Complete-Transaction

这些命令先启动事务,然后完成事务。 在使用 “完成事务” 命令之前,不会对注册表进行更改。

示例 3:使用不同的回滚首选项

PS C:\> cd HKCU:\software
PS HKCU:\software> Start-Transaction
PS HKCU:\software> New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction
PS HKCU:\software> New-Item -Path . -Name "ContosoCompany" -UseTransaction
PS HKCU:\software> Start-Transaction -RollbackPreference never
PS HKCU:\software> New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction
PS HKCU:\software> New-Item -Path . -Name "ContosoCompany" -UseTransaction

# Start-Transaction (-rollbackpreference error)

PS HKCU:\software> Start-Transaction
PS HKCU:\software> New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction
New-Item : The registry key at the specified path does not exist.
At line:1 char:9
+ new-item <<<<  -Path NoPath -Name ContosoCompany -UseTransaction

PS HKCU:\software> New-Item -Path . -Name "Contoso" -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 ContosoCompany -UseTransaction

# Start-Transaction (-rollbackpreference never)

PS HKCU:\software> Start-Transaction -RollbackPreference never
PS HKCU:\software> New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction

New-Item : The registry key at the specified path does not exist.
At line:1 char:9
+ new-item <<<<  -Path NoPath -Name "ContosoCompany" -UseTransaction
PS HKCU:\software> New-Item -Path . -Name "ContosoCompany" -UseTransaction

Hive: HKEY_CURRENT_USER\Software
SKC  VC Name                           Property
---  -- ----                           --------
0   0 ContosoCompany                 {}
PS HKCU:\Software> Complete-Transaction

# Succeeds

此示例演示更改 RollbackPreference 参数值的效果。

在第一组命令中, Start-Transaction 不使用 RollbackPreference。 因此,将使用默认值 (Error) 。 当事务命令中发生错误时,即指定的路径不存在时,会自动回滚该事务。

第二组命令中, Start-Transaction 使用 RollbackPreference ,值为 Never。 因此当事务命令发生错误时,事务仍处于活动状态并且可以成功完成。

由于大多数事务必须在不出错的情况下执行,因此通常首选 默认值 RollbackPreference

示例 4:在事务正在进行时使用此 cmdlet

PS C:\> cd HKCU:\software
PS HKCU:\software> Start-Transaction
PS HKCU:\software> New-Item "ContosoCompany" -UseTransaction
PS HKCU:\software> Start-Transaction
PS HKCU:\software> Get-Transaction
PS HKCU:\software> New-Item "ContosoCompany2" -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 命令是同一事务的一部分。

在整个事务完成之前,不会对注册表进行更改。 若要完成事务,必须输入两个 “完成事务” 命令,每个订阅者一个。 如果在任何时候回滚事务,所有事务都将为两个订阅者回滚。

示例 5:在独立事务正在进行时启动独立事务

PS C:\> cd HKCU:\software
PS HKCU:\software> Start-Transaction
PS HKCU:\software> New-Item "ContosoCompany" -UseTransaction
PS HKCU:\software> Start-Transaction -Independent
PS HKCU:\software> Get-Transaction
PS HKCU:\software> Undo-Transaction
PS HKCU:\software> New-ItemProperty -Path "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
PS HKCU:\software> Complete-Transaction
PS HKCU:\software> dir contoso*
PS HKCU:\Software> Get-Transaction

RollbackPreference   SubscriberCount   Status
------------------   ---------------   ------
Error                1                 Active
PS HKCU:\software> Undo-Transaction
PS HKCU:\software> New-ItemProperty -Path "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
MyKey
-----
123
PS HKCU:\software> Complete-Transaction
PS HKCU:\software> dir contoso*
Hive: HKEY_CURRENT_USER\Software
SKC  VC Name                           Property
---  -- ----                           --------
0   1 MyCompany                      {MyKey}

此示例演示了使用 Start-TransactionIndependent 参数启动另一个事务时启动事务的效果。 在本例中,将回滚新事务,而不影响原来的事务。

虽然事务在逻辑上是独立的,但由于一次只能有一个事务处于活动状态,因此你必须回滚或提交最新事务,然后才能继续处理原来的事务。

第一组命令启动一个事务。 New-Item 命令是第一个事务的一部分。

第二组命令中, Start-Transaction 命令使用 Independent 参数。 下面的 Get-Transaction 命令显示活动事务的事务对象,这是最新的事务。 订阅者计数等于 1,表示事务不相关。

使用 Undo-Transaction 命令回滚活动事务时,原始事务将再次变为活动状态。

New-ItemProperty 命令是原始事务的一部分,完成时没有错误,原始事务可以使用 Complete-Transaction 命令完成。 因此注册表会发生更改。

示例 6:运行不属于事务的命令

PS C:\> cd hkcu:\software
PS HKCU:\software> Start-Transaction
PS HKCU:\software> New-Item "ContosoCompany1" -UseTransaction
PS HKCU:\software> New-Item "ContosoCompany2"
PS HKCU:\software> New-Item "ContosoCompany3" -UseTransaction
PS HKCU:\software> dir contoso*
PS HKCU:\software> Complete-Transaction
PS HKCU:\software> dir contoso*
PS HKCU:\Software> dir contoso*

Hive: HKEY_CURRENT_USER\Software
SKC  VC Name                           Property
---  -- ----                           --------
0   0 ContosoCompany2                {}

PS HKCU:\Software> Complete-Transaction
PS HKCU:\Software> dir contoso*

Hive: HKEY_CURRENT_USER\Software
SKC  VC Name                           Property
---  -- ----                           --------
0   0 ContosoCompany1                     {}
0   0 ContosoCompany2                     {}
0   0 ContosoCompany3                     {}

此示例演示了在事务正在执行时提交的命令可以包含在事务中,也可以不包含在事务中。 只有使用 UseTransaction 参数的 命令是事务的一部分。

第一个和第三个 New-Item 命令使用 UseTransaction 参数。 这两个命令都包含在事务中。 由于第二个 New-Item 命令不使用 UseTransaction 参数,因此它不是事务的一部分。

第一个 dir 命令显示效果。 第二个 New-Item 命令会立即完成,但在提交事务之前,第一个和第三个 New-Item 命令无效。

“完成事务”命令提交事务。 因此,第二个 dir 命令显示所有新项都已添加到注册表中。

示例 7:回滚未在指定时间内完成的事务

PS C:\> Start-Transaction -Timeout 2

# Wait two minutes...

PS C:\> Get-Transaction
PS C:\> New-Item HKCU:\Software\ContosoCompany -UseTransaction
PS C:\> Start-Transaction -Timeout 2

# Wait two minutes...

PS C:\> > Get-Transaction

RollbackPreference   SubscriberCount   Status
------------------   ---------------   -----------
Error                1                 RolledBack

PS C:\> New-Item HKCU:\Software\ContosoCompany -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-TransactionTimeout 参数启动必须在两分钟内完成的事务。 如果事务在超时到期时未完成,则会自动回滚。

超时到期后,不会通知你,但事务对象的 Status 属性设置为 RolledBack,使用 UseTransaction 参数的命令将失败。

参数

-Confirm

提示你在运行 cmdlet 之前进行确认。

Type:SwitchParameter
Aliases:cf
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Independent

指示此 cmdlet 启动独立于任何正在进行的事务的事务。 默认情况下,如果在另一个事务正在进行时使用 Start-Transaction ,则会向正在进行的事务添加新订阅服务器。 仅当会话中已经在执行某项事务时,此参数才有效。

默认情况下,如果在事务正在进行时使用 Start-Transaction ,则会重用现有事务对象并增加订阅者计数。 这与加入原来事务的效果非常类似。 Undo-Transaction 命令回滚整个事务。 若要完成事务,则必须为每个订阅者输入一个 Complete-Transaction 命令。 因为同时执行的多数事务都是相关的,所以默认设置可满足大多数用途的要求。

如果指定 Independent 参数,此 cmdlet 将创建一个新事务,该事务可以在不影响原始事务的情况下完成或撤消。 但是,由于一次只能有一个事务处于活动状态,因此必须完成或回滚新事务,然后才能继续处理原来的事务。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-RollbackPreference

指定自动回滚事务的条件。 此参数的可接受值为:

  • 错误。 当发生终止错误或非终止错误时,自动回滚事务。
  • TerminatingError。 当发生终止错误时,自动回滚事务。
  • 从不。 从不自动回滚事务。

默认值为 Error。

Type:RollbackSeverity
Accepted values:Error, TerminatingError, Never
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Timeout

指定事务处于活动状态的最长时间,以分钟为单位。 当该超时到期时,将自动回滚事务。

默认情况下,在命令行启动的事务没有超时值。 如果事务由脚本启动,则默认超时值为 30 分钟。

Type:Int32
Aliases:TimeoutMins
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-WhatIf

显示运行该 cmdlet 时会发生什么情况。 此 cmdlet 未运行。

Type:SwitchParameter
Aliases:wi
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

输入

None

不能通过管道将输入传递给此 cmdlet。

输出

None

此 cmdlet 将不生成任何输出。