about_Transactions

Назначение: Windows PowerShell 2.0, Windows PowerShell 3.0

РАЗДЕЛ

о транзакциях

КРАТКОЕ ОПИСАНИЕ

В этом разделе описывается, как управлять транзакциями в Windows PowerShell®.

ПОДРОБНОЕ ОПИСАНИЕ

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

О ТРАНЗАКЦИЯХ

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

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

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

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

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

      Cmdlet                 Description
      --------------         ---------------------------------    
      Start-Transaction      Starts a new transaction. 

      Use-Transaction        Adds a command or expression to the
                             transaction. The command must use
                             transaction-enabled objects.

      Undo-Transaction       Rolls back the transaction so that
                             no data is changed by the transaction.

      Complete-Transaction   Commits the transaction. The data
                             affected by the transaction is changed.

      Get-Transaction        Gets information about the active
                             transaction.

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

          get-command *transaction

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

          get-help <cmdlet-name> -detailed

Например:

          get-help use-transaction -detailed

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

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

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

Другие поставщики Windows PowerShell также могут поддерживать транзакции. Чтобы в сеансе найти поставщиков Windows PowerShell с поддержкой транзакций, используйте приведенную ниже команду. Она позволит найти значение Transactions в свойстве Capabilities поставщиков.

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

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

        get-help <provider-name>

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

        get-help registry

ПАРАМЕТР USETRANSACTION

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

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

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

        get-help * -parameter UseTransaction

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

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

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

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

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

RollbackPreference:

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

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

Status:

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

SubscriberCount:

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

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

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

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

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

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

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

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

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

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

          (Get-Transaction).SubscriberCount

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

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

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

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

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

Если вы изменяете данные с помощью транзакций, данные, затрагиваемые транзакцией, не изменяются до ее выполнения. Но те же данные можно изменить с помощью команд, которые не являются частью транзакции.

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

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

ПРИМЕРЫ

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

ПРИМЕР 1. ВЫПОЛНЕНИЕ ТРАНЗАКЦИИ

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

        start-transaction

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

Например, следующая команда, которая задает текущее расположение в разделе Software диска 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

Следующая команда добавляет запись реестра MyKey в раздел MyCompany с помощью командлета New-ItemProperty. Для включения команды в транзакцию используется параметр 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. ОБЪЕДИНЕНИЕ КОМАНД С ПОДДЕРЖКОЙ ТРАНЗАКЦИЙ И БЕЗ

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

Следующая команда запускает транзакцию в разделе реестра 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

Следующая команда добавляет раздел MyCompany в реестр с помощью командлета New-Item. Для включения команды в транзакцию используется параметр 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 для свойства SubscriberCount.

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

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

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

Следующая команда запускает транзакцию с параметром отката 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

Командлет Use-Transaction позволяет непосредственно писать сценарии с объектами Microsoft .NET Framework, которые поддерживают транзакции. Этот командлет применяет блок сценариев, который может содержать только команды и выражения, использующие объекты .NET Framework с поддержкой транзакций, например экземпляры класса Microsoft.PowerShell.Commands.Management.TransactedString.

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

         start-transaction

Следующая команда New-Object создает экземпляр класса TransactedString и сохраняет его в переменной $t:

         $t = New-Object Microsoft.PowerShell.Commands.Management.TransactedString

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

        $t.append("Windows")

Следующая команда добавляет текст с помощью того же метода Append, но текст добавляется в рамках транзакции. Команда заключается в фигурные скобки и задается как значение параметра 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

Результат показывает представление транзакции.

        Windows PowerShell

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

        complete-transaction

Чтобы увидеть окончательную строку, введите:

        $t.tostring()

        Windows PowerShell

ПРИМЕР 7. УПРАВЛЕНИЕ ТРАНЗАКЦИЯМИ С НЕСКОЛЬКИМИ ПОДПИСЧИКАМИ

При запуске одной транзакции во время выполнения другой Windows 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

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

        new-itemproperty -path MyCompany -name MyKey -UseTransaction

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

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

        complete-transaction

Команда Get-Transaction показывает, что количество подписчиков (SubscriberCount) на объект транзакции равно 1, но в столбце состояния (Status) все еще указано значение Active (не Committed).

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

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

        complete-transaction

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

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

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

При запуске одной транзакции во время выполнения другой можно воспользоваться параметром Independent командлета 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

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

СМ. ТАКЖЕ

Start-Transaction

Get-Transaction

Complete-Transaction

Undo-Transaction

Use-Transaction

Поставщик реестра

about_Providers

Get-PSProvider

Get-ChildItem