添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
大气的香槟  ·  mysql ...·  3 月前    · 
一身肌肉的大葱  ·  用Digital ...·  4 月前    · 
成熟的荔枝  ·  ASP.NET Core ...·  1 年前    · 
风流的绿豆  ·  js中三目运算符和&& || ...·  1 年前    · 

介绍如何在 PowerShell 中管理事务处理的操作。

从 PowerShell 2.0 开始,PowerShell 支持事务。 使用此功能可以启动事务、指示哪些命令是事务的一部分,以及提交或回滚事务。

在 PowerShell 中,事务是一组作为逻辑单元管理的一个或多个命令。 事务可以 (“committed”) 完成,这会更改受事务影响的数据。 或者,可以完全撤消事务 (“回滚”) ,以便事务不会更改受影响的数据。

由于事务中的命令作为一个单元进行管理,因此要么提交所有命令,要么回滚所有命令。

事务在数据处理中广泛使用,尤其是在数据库操作和财务事务中。 当一组命令的最坏情况不是它们都失败,而是某些命令成功,而另一些命令失败,使系统处于损坏、错误或无法解释的状态(难以修复)时,最常使用事务。

TRANSACTION CMDLETS

PowerShell 包括多个用于管理事务的 cmdlet。

  • 启动事务:启动新事务。
  • Use-Transaction:向事务添加命令或表达式。 命令必须使用已启用事务的对象。
  • 撤消事务:回滚事务,以便事务不会更改任何数据。
  • Complete-Transaction:提交事务。 事务影响的数据将发生更改。
  • Get-Transaction:获取有关活动事务的信息。
  • 对于事务 cmdlet 列表,请键入:

    get-command *transaction
    

    有关 cmdlet 的详细信息,请键入:

    get-help use-transaction -detailed
    

    已启用事务的元素

    若要参与事务,cmdlet 和提供程序都必须支持事务。 此功能内置于受事务影响的 对象中。

    PowerShell 注册表提供程序支持 Windows Vista 中的事务。 TransactedString 对象 (Microsoft.PowerShell.Commands.Management.TransactedString) 适用于运行 PowerShell 的任何操作系统。

    其他 PowerShell 提供程序可以支持事务。 若要在会话中查找支持事务的 PowerShell 提供程序,请使用以下命令在提供程序的 Capabilities 属性中查找“事务”值:

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

    有关提供程序的详细信息,请参阅提供程序的帮助。 若要获取提供程序帮助,请键入:

    get-help <provider-name>
    

    例如,若要获取有关 Registry 提供程序的帮助,请键入:

    get-help registry
    

    USETRANSACTION 参数

    可支持事务的 Cmdlet 具有 UseTransaction 参数。 此参数包括活动事务中的 命令。 可以使用完整的参数名称或其别名“usetx”。

    仅当会话包含活动事务时,才能使用 参数。 如果没有活动事务,如果输入具有 UseTransaction 参数的命令,该命令将失败。

    若要查找具有 UseTransaction 参数的 cmdlet,请键入:

    get-help * -parameter UseTransaction
    

    在 PowerShell 核心中,设计用于 PowerShell 提供程序的所有 cmdlet 都支持事务。 因此,可以使用提供程序 cmdlet 来管理事务。

    有关 PowerShell 提供程序的详细信息,请参阅 about_Providers

    TRANSACTION 对象

    事务在 PowerShell 中由事务对象 System.Management.Automation.Transaction 表示。

    该对象包含以下属性:

  • 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:预览事务

    通常,事务中使用的命令会更改数据。 但是,获取数据的命令在事务中也很有用,因为它们在事务中获取数据。 这提供了提交事务将导致的更改的预览。

    以下示例演示如何在别名为“dir”) (使用 Get-ChildItem 命令来预览事务中的更改。

    以下命令启动事务。

    start-transaction
    

    以下命令使用 New-ItemProperty cmdlet 将 MyKey 注册表项添加到 MyCompany 项。 命令使用 UseTransaction 参数在事务中包含 命令。

    new-itemproperty -path MyCompany -Name MyKey -value 123 -UseTransaction
    

    命令返回表示新注册表项的 对象,但注册表项不会更改。

    MyKey
    -----
    

    若要获取当前位于注册表中的项,请使用不带 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:合并事务处理和非事务处理命令

    可以在事务期间输入非事务处理命令。 非事务处理命令会立即影响数据,但它们不会影响事务。 以下命令在 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 参数更改首选项。

    以下命令启动回滚首选项为“Never”的事务。

    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 参数的值。 UseTx) (UseTransaction 参数是必需的。

    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
    

    若要完成提交事务,请输入第二个“完成事务”命令。 若要提交多订阅服务器事务,必须为每个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                      {}
    
  • about_Providers
  • Get-ChildItem
  • Get-PSProvider
  • Complete-Transaction
  • Get-Transaction
  • Start-Transaction
  • Undo-Transaction
  • Use-Transaction
  •