Поделиться через


Start-Transaction

Запускает транзакцию.

Синтаксис

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

Описание

Командлет Start-Transaction запускает транзакцию, которая представляет собой ряд команд, управляемых как единица. Транзакцию можно завершить или зафиксировать. Кроме того, его можно полностью отменить или откатить, чтобы все данные, измененные транзакцией, восстанавливались в исходном состоянии. Так как команды транзакции управляются как единое целое, фиксируются или откатываются все команды.

По умолчанию, если любая команда в транзакции создает ошибку, транзакции откатываются автоматически. Для изменения этого поведения можно использовать параметр RollbackPreference .

Командлеты, используемые в транзакции, должны поддерживать такую возможность. Командлеты, поддерживающие транзакции, имеют параметр UseTransaction . Для выполнения транзакций в поставщике поставщик должен поддерживать транзакции. Поставщик реестра Windows PowerShell в Windows Vista и более поздних версиях операционной системы Windows поддерживает транзакции. Можно также использовать класс Microsoft.PowerShell.Commands.Management.TransactedString для включения выражений в транзакции в любой версии системы Windows, поддерживающей Windows PowerShell. Другие поставщики Windows PowerShell также могут поддерживать транзакции.

Одновременно может быть активна только одна транзакция. При запуске новой независимой транзакции во время выполнения транзакции новая транзакция становится активной транзакцией, и перед внесением изменений в исходную транзакцию необходимо зафиксировать или откатить новую транзакцию.

Start-Transaction командлет является одним из наборов командлетов, поддерживающих функцию транзакций в Windows PowerShell. Дополнительные сведения см. в about_Transactions.

Примеры

Пример 1. Запуск и откат транзакции

Set-Location hkcu:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
New-ItemProperty "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
Undo-Transaction

Эти команды запускают, а затем откатывают транзакцию. Так как транзакция откатывается, изменения в реестр не вносятся.

Пример 2. Запуск и завершение транзакции

Set-Location hkcu:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
New-ItemProperty "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
Complete-Transaction

Эти команды запускают, а затем завершают транзакцию. Изменения в реестре не вносятся до тех пор, пока команда не будет использована Complete-Transaction .

Пример 3. Использование различных настроек отката

Set-Location HKCU:\software
Start-Transaction
New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction
New-Item -Path . -Name "ContosoCompany" -UseTransaction
Start-Transaction -RollbackPreference never
New-Item -Path "NoPath" -Name "ContosoCompany" -UseTransaction
New-Item -Path . -Name "ContosoCompany" -UseTransaction

# Start-Transaction (-rollbackpreference error)

Start-Transaction
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

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)

Start-Transaction -RollbackPreference never
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

New-Item -Path . -Name "ContosoCompany" -UseTransaction

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

# Succeeds

В этом примере показано, как изменить значение параметра RollbackPreference .

В первом наборе команд Start-Transaction не используется RollbackPreference. В результате используется значение по умолчанию (ошибка). Если ошибка возникает в команде транзакции, то есть указанный путь не существует, транзакция автоматически откатывается.

Во втором наборе команд Start-Transaction используется RollbackPreference со значением Never. Поэтому, когда в команде транзакции происходит ошибка, транзакция остается активной и ее можно успешно завершить.

Так как большинство транзакций должны выполняться без ошибок, значение по умолчанию rollbackPreference обычно предпочтительнее.

Пример 4. Использование этого командлета во время выполнения транзакции

Set-Location HKCU:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
Start-Transaction
Get-Transaction
New-Item "ContosoCompany2" -UseTransaction
Complete-Transaction
Complete-Transaction
Get-Transaction

RollbackPreference   SubscriberCount   Status
------------------   ---------------   ------
Error                2                 Active

В этом примере показан эффект использования Start-Transaction во время выполнения транзакции. Он во многом похож на присоединение к выполняющейся транзакции.

Хотя это упрощенная команда, этот сценарий часто возникает при выполнении скрипта, включающего полную транзакцию.

Первая Start-Transaction команда запускает транзакцию. Первая New-Item команда является частью транзакции.

Вторая Start-Transaction команда добавляет нового подписчика в транзакцию. Теперь Get-Transaction команда возвращает транзакцию с числом подписчиков 2. Вторая New-Item команда является частью той же транзакции.

Изменения в реестре не вносятся до завершения всей транзакции. Чтобы завершить транзакцию, необходимо ввести две Complete-Transaction команды, по одному для каждого подписчика. Если вы хотите откатить транзакцию в любой момент, все транзакции будут откатированы для обоих подписчиков.

Пример 5. Запуск независимой транзакции во время выполнения

Set-Location HKCU:\software
Start-Transaction
New-Item "ContosoCompany" -UseTransaction
Start-Transaction -Independent
Get-Transaction
Undo-Transaction
New-ItemProperty -Path "ContosoCompany" -Name "MyKey" -Value 123 -UseTransaction
Complete-Transaction
Get-ChildItem contoso*
Get-Transaction

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

В этом примере показано, как использовать независимый параметр Start-Transaction для запуска транзакции во время выполнения другой транзакции. В этом случае новая транзакция откатывается, не затрагивая исходной транзакции.

Хотя транзакции логически не зависят друг от друга, одновременно может быть активна только одна транзакция, поэтому более позднюю транзакцию нужно откатить или зафиксировать, прежде чем возобновлять работу с исходной.

Первый набор команд запускает транзакцию. Команда New-Item является частью первой транзакции.

Во втором наборе команд Start-Transaction команда использует параметр Independent . Следующая Get-Transaction команда показывает объект транзакции для активной транзакции, которая является самой новой. Число подписчиков равно 1, которое показывает, что транзакции не связаны.

При откате активной транзакции с помощью команды исходная транзакция снова становится активной Undo-Transaction .

Команда New-ItemProperty , которая является частью исходной транзакции, завершается без ошибок, а исходная транзакция может быть выполнена Complete-Transaction с помощью команды. В результате реестр изменяется.

Пример 6. Выполнение команд, которые не являются частью транзакции

Set-Location hkcu:\software
Start-Transaction
New-Item "ContosoCompany1" -UseTransaction
New-Item "ContosoCompany2"
New-Item "ContosoCompany3" -UseTransaction
Get-ChildItem contoso*

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

Complete-Transaction
Get-ChildItem 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 , она не является частью транзакции.

Первая команда Get-ChildItem показывает эффект. Вторая New-Item команда завершается немедленно, но первая и третья New-Item команды не являются эффективными, пока транзакция не будет зафиксирована.

Команда Complete-Transaction фиксирует транзакцию. В результате вторая команда Get-ChildItem показывает, что все новые элементы добавляются в реестр.

Пример 7. Откат транзакции, которая не завершается в заданное время

Start-Transaction -Timeout 2

# Wait two minutes...

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

# Wait two minutes...

Get-Transaction

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

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

Эта команда использует параметр Timeout для Start-Transaction запуска транзакции, которая должна быть завершена в течение двух минут. Если транзакция не завершена, когда истекает время ожидания, она откатывается автоматически.

Когда истекает время ожидания, вы не получите уведомления, но свойство Status объекта транзакции имеет значение RolledBack и команды, использующие параметр UseTransaction, завершается ошибкой.

Параметры

-Confirm

Запрос подтверждения перед выполнением командлета.

Тип:SwitchParameter
Aliases:cf
Position:Named
Default value:False
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Independent

Указывает, что этот командлет запускает транзакцию, которая не зависит от выполняемых транзакций. По умолчанию при выполнении Start-Transaction другой транзакции новый подписчик добавляется в транзакцию. Этот параметр действует только в том случае, если в рамках сеанса уже выполняется транзакция.

По умолчанию при Start-Transaction выполнении транзакции существующий объект транзакции повторно используется, а число подписчиков увеличивается. Результат во многом похож на присоединение к исходной транзакции. Команда Undo-Transaction откатывает всю транзакцию. Чтобы завершить транзакцию, необходимо ввести Complete-Transaction команду для каждого подписчика. Так как обычно одновременно выполняющиеся транзакции связаны, значения по умолчанию в большинстве случаев достаточно.

Если указать независимый параметр, этот командлет создает новую транзакцию, которая может быть завершена или отменена, не затрагивая исходную транзакцию. Однако, поскольку одновременно может быть активна только одна транзакция, новую транзакцию необходимо завершить или откатить, прежде чем возобновлять работу с исходной транзакцией.

Тип:SwitchParameter
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-RollbackPreference

Указывает условия, при которых транзакция автоматически откатывается. Допустимые значения для этого параметра:

  • Error Транзакция откатывается автоматически, если возникает завершающая или не завершающаяся ошибка.
  • TerminatingError Транзакция откатывается автоматически, если возникает завершающаяся ошибка.
  • Never Транзакция никогда не откатывается автоматически.

Значение по умолчанию — Error.

Тип:RollbackSeverity
Допустимые значения:Error, TerminatingError, Never
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Timeout

Указывает максимальный период времени в минутах, в течение которого транзакция может быть активна. По истечении времени ожидания транзакция откатывается автоматически.

По умолчанию для транзакций, запускаемых из командной строки, время ожидания не устанавливается. Если транзакции запускаются с помощью сценария, время ожидания по умолчанию — 30 минут.

Тип:Int32
Aliases:TimeoutMins
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-WhatIf

Показывает, что произойдет при запуске командлета. Командлет не выполняется.

Тип:SwitchParameter
Aliases:wi
Position:Named
Default value:False
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

Входные данные

None

В этот командлет нельзя передать входные данные.

Выходные данные

None

Этот командлет не формирует никаких выходных данных.