启动事务。

语法

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 参数的命令将失败。






另请参阅




目录