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


about_Transactions

Краткое описание

Описывает управление транзакциями в PowerShell.

Подробное описание

Транзакции поддерживаются в PowerShell, начиная с PowerShell 2.0. Эта функция позволяет запускать транзакцию, указывать, какие команды являются частью транзакции, а также фиксировать или откатить транзакцию.

СВЕДЕНИЯ О ТРАНЗАКЦИЯХ

В PowerShell транзакция — это набор одной или нескольких команд, управляемых как логическая единица. Транзакция может быть завершена ("зафиксирована"), которая изменяет данные, затронутые транзакцией. Кроме того, транзакцию можно полностью отменить ("откатить"), чтобы затронутые данные не изменялись транзакцией.

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

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

КОМАНДЛЕТЫ ТРАНЗАКЦИЙ

PowerShell включает несколько командлетов, предназначенных для управления транзакциями.

  • Start-Transaction: запускает новую транзакцию.
  • Use-Transaction: добавляет команду или выражение в транзакцию. Команда должна использовать объекты с поддержкой транзакций.
  • Отмена транзакции: откат транзакции, чтобы данные не изменялись транзакцией.
  • Завершенная транзакция: фиксирует транзакцию. Данные, затронутые транзакцией, изменяются.
  • Get-Transaction: получает сведения об активной транзакции.

Для списка командлетов транзакций введите следующее:

get-command *transaction

Подробные сведения о командлетах введите:

get-help use-transaction -detailed

ЭЛЕМЕНТЫ С ПОДДЕРЖКОЙ ТРАНЗАКЦИЙ

Для участия в транзакции командлет и поставщик должны поддерживать транзакции. Эта функция встроена в объекты, затронутые транзакцией.

Поставщик реестра PowerShell поддерживает транзакции в Windows Vista. Объект TransactedString (Microsoft.PowerShell.Commands.Management.TransactedString) работает с любой операционной системой, работающей под управлением PowerShell.

Другие поставщики PowerShell могут поддерживать транзакции. Чтобы найти поставщиков PowerShell в сеансе, поддерживающих транзакции, используйте следующую команду, чтобы найти значение "Транзакции" в свойстве "Возможности" поставщиков:

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

Дополнительные сведения о поставщике см. в справке по поставщику. Чтобы получить справку поставщика, введите следующее:

get-help <provider-name>

Например, чтобы получить справку для поставщика Registry, введите:

get-help registry

ПАРАМЕТР USETRANSACTION

Командлеты, которые могут поддерживать транзакции, имеют параметр UseTransaction. Этот параметр включает команду в активной транзакции. Вы можете использовать полное имя параметра или его псевдоним usetx.

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

Чтобы найти командлеты с параметром UseTransaction, введите следующее:

get-help * -parameter UseTransaction

В PowerShell core все командлеты, предназначенные для работы с поставщиками PowerShell, поддерживают транзакции. В результате можно использовать командлеты поставщика для управления транзакциями.

Дополнительные сведения о поставщиках PowerShell см. в about_Providers.

ОБЪЕКТ ТРАНЗАКЦИИ

Транзакции представлены в PowerShell объектом транзакции System.Management.Automation.Transaction.

Объект имеет следующие свойства.

  • RollbackPreference: содержит параметр отката для текущей транзакции. Вы можете задать параметр отката при использовании start-Transaction для запуска транзакции.

    Параметр отката определяет условия автоматического отката транзакции. Допустимые значения: Error, TerminatingError и Never. Значение по умолчанию — Error.

  • Состояние: содержит текущее состояние транзакции. Допустимые значения: Active, Committed и RolledBack.

  • Подписчик: содержит количество подписчиков транзакции. Подписчик добавляется в транзакцию при запуске транзакции во время выполнения другой транзакции. Количество подписчиков уменьшается, когда подписчик фиксирует транзакцию.

АКТИВНЫЕ ТРАНЗАКЦИИ

В PowerShell только одна транзакция активна одновременно, и вы можете управлять только активной транзакцией. Одновременно несколько транзакций могут выполняться в одном сеансе, но активна только последняя запущенная транзакция.

В результате при использовании командлетов транзакций нельзя указать определенную транзакцию. Команды всегда применяются к активной транзакции.

Это наиболее очевидно в поведении командлета Get-Transaction. При вводе команды Get-Transaction Get-Transaction всегда получает только один объект транзакции. Этот объект представляет активную транзакцию.

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

ПОДПИСЧИКИ И НЕЗАВИСИМЫЕ ТРАНЗАКЦИИ

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

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

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

(Get-Transaction).SubscriberCount

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

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

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

После завершения независимой транзакции (фиксации или отката), исходная транзакция снова становится активной транзакцией.

ИЗМЕНЕНИЕ ДАННЫХ

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

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

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

Примеры

В примерах этого раздела используется поставщик реестра PowerShell и предполагается, что вы знакомы с ним. Для получения сведений о поставщике реестра введите "реестр get-help".

ПРИМЕР 1. ФИКСАЦИЯ ТРАНЗАКЦИИ

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

start-transaction

Чтобы включить команды в транзакцию, используйте параметр UseTransaction командлета. По умолчанию команды не включаются в транзакцию.

Например, следующая команда, которая задает текущее расположение в ключе программного обеспечения HKCU: диск, не включается в транзакцию.

cd hkcu:\Software

Следующая команда, которая создает ключ MyCompany, использует параметр UseTransaction командлета New-Item для включения команды в активную транзакцию.

new-item MyCompany -UseTransaction

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

Hive: HKEY_CURRENT_USER\Software

SKC  VC Name                           Property
---  -- ----                           --------
  0   0 MyCompany                      {}

Чтобы зафиксировать транзакцию, используйте командлет Complete-Transaction. Так как она всегда влияет на активную транзакцию, нельзя указать транзакцию.

complete-transaction

В результате в реестр добавляется раздел MyCompany.

dir m*
Hive: HKEY_CURRENT_USER\software

SKC  VC Name                           Property
---  -- ----                           --------
 83   1 Microsoft                      {(default)}
  0   0 MyCompany                      {}

ПРИМЕР 2. ОТКАТ ТРАНЗАКЦИИ

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

start-transaction

Следующая команда, которая создает ключ MyOtherCompany, использует параметр UseTransaction командлета New-Item для включения команды в активную транзакцию.

new-item MyOtherCompany -UseTransaction

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

Hive: HKEY_CURRENT_USER\Software

SKC  VC Name                           Property
---  -- ----                           --------
  0   0 MyOtherCompany                 {}

Чтобы откатить транзакцию, используйте командлет Undo-Transaction. Так как она всегда влияет на активную транзакцию, вы не указываете транзакцию.

Undo-transaction

Результатом является то, что раздел MyOtherCompany не добавляется в реестр.

dir m*
Hive: HKEY_CURRENT_USER\software

SKC  VC Name                           Property
---  -- ----                           --------
 83   1 Microsoft                      {(default)}
  0   0 MyCompany                      {}

ПРИМЕР 3. ПРОСМОТР ТРАНЗАКЦИИ

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

В следующем примере показано, как использовать команду Get-ChildItem (псевдоним — dir) для предварительного просмотра изменений в транзакции.

Следующая команда запускает транзакцию.

start-transaction

Следующая команда использует командлет New-ItemProperty для добавления записи реестра MyKey в раздел MyCompany. Команда использует параметр UseTransaction для включения команды в транзакцию.

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

Команда возвращает объект, представляющий новую запись реестра, но запись реестра не изменяется.

MyKey
-----
123

Чтобы получить элементы, находящиеся в реестре, используйте команду Get-ChildItem ("dir") без параметра UseTransaction. Следующая команда получает элементы, начинающиеся с "M".

dir m*

Результат показывает, что записи еще не добавлены в ключ MyCompany.

Hive: HKEY_CURRENT_USER\Software

SKC  VC Name                           Property
---  -- ----                           --------
 83   1 Microsoft                      {(default)}
  0   0 MyCompany                      {}

Чтобы просмотреть эффект фиксации транзакции, введите команду Get-ChildItem ("dir") с параметром UseTransaction. Эта команда содержит представление данных из транзакции.

dir m* -useTransaction

В результате показано, что, если транзакция зафиксирована, запись MyKey будет добавлена в ключ MyCompany.

Hive: HKEY_CURRENT_USER\Software

SKC  VC Name                           Property
---  -- ----                           --------
 83   1 Microsoft                      {(default)}
  0   1 MyCompany                      {MyKey}

ПРИМЕР 4. CO МБ INING TRANSACTED И НЕ ТРАНСАКТИРОВАННЫЕ КОМАНДЫ

Во время транзакции можно ввести непереработаемые команды. Команды, не относящиеся к транзакциям, немедленно влияют на данные, но они не влияют на транзакцию. Следующая команда запускает транзакцию в разделе реестра HKCU:\Software.

start-transaction

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

new-item MyCompany1 -UseTransaction
new-item MyCompany2
new-item MyCompany3 -UseTransaction

Чтобы просмотреть текущее состояние реестра, используйте команду Get-ChildItem ("dir") без параметра UseTransaction. Эта команда получает элементы, начинающиеся с "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 для добавления раздела 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 подтверждает откат транзакции и значение 0 подписчика.

RollbackPreference   SubscriberCount   Status
------------------   ---------------   ------
Error                0                 RolledBack

ПРИМЕР 6. ИЗМЕНЕНИЕ ПРЕДПОЧТЕНИЯ ОТКАТА

Если требуется, чтобы транзакция была более терпимой, можно использовать параметр RollbackPreference start-Transaction для изменения предпочтения.

Следующая команда запускает транзакцию с параметром отката "Никогда".

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

Командлет Use-Transaction позволяет выполнять прямые скрипты для объектов 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

Следующая команда использует метод Add объекта TransactedString для добавления текста в строку. Так как команда не является частью транзакции, изменение действует немедленно.

$t.append("Windows")

Следующая команда использует тот же метод Add для добавления текста, но добавляет текст в рамках транзакции. Команда заключена в фигурные скобки, и она задается в качестве значения параметра ScriptBlock для Use-Transaction. Обязательный параметр UseTransaction (UseTx).

use-transaction {$t.append(" PowerShell")} -usetx

Чтобы просмотреть текущее содержимое транзакционной строки в $t, используйте метод ToString объекта TransactedString.

$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 для добавления записи реестра MyKey в раздел MyCompany. Он использует параметр UseTransaction для включения команды в транзакцию.

new-itemproperty -path MyCompany -name MyKey -UseTransaction

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

Следующая команда фиксирует транзакцию. Если она откатила транзакцию, транзакция будет откатена для всех подписчиков.

complete-transaction

Команда Get-Transaction показывает, что количество подписчиков в объекте транзакции равно 1, но значение status по-прежнему активно (не зафиксировано).

RollbackPreference   SubscriberCount   Status
------------------   ---------------   ------
Error                1                 Active

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

complete-transaction

Другая команда Get-Transaction показывает, что транзакция зафиксирована.

RollbackPreference   SubscriberCount   Status
------------------   ---------------   ------
Error                0                 Committed

ПРИМЕР 9. УПРАВЛЕНИЕ НЕЗАВИСИМЫМИ ТРАНЗАКЦИЯМИ

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

При выполнении 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

Обратите внимание, что подписчиком транзакции является 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                      {}

См. также