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


Операции администрирования COM+ в транзакциях

База данных регистрации COM+ (RegDB) — это диспетчер ресурсов, который может участвовать в транзакциях COM+. Это позволяет выполнять операции администрирования в транзакции и иметь все изменения конфигурации, зафиксированные или прерванные в виде атомарной операции, даже на нескольких компьютерах. В некоторых случаях это может быть очень полезно, хотя существует изоляция и блокировка поведения, которые следует учитывать, и выполнение задач администрирования в транзакциях включает незначительные изменения в обычной модели программирования администрирования.

Преимущества выполнения операций администрирования в транзакциях

  • **Согласованность данных— **Администрирование, выполняемые в транзакции, фиксируются или прерваны в целом, хотя существуют некоторые ресурсы каталога, не связанные с транзакцией COM+, для которых это может быть не так. (См. ресурсы каталога, отличные от транзакций COM+ ниже.)
  • **Согласованное развертывание на нескольких компьютерах. **Если вы развертываете приложения COM+ на нескольких серверах, вы можете гарантировать, что все серверы остаются с одинаковыми конфигурациями.
  • **Масштабирование и производительность. **При выполнении нескольких операций в транзакции все операции записи в RegDB выполняются одновременно. Сохраняемые записи в RegDB являются относительно дорогой операцией; Если вы делаете много операций записи в RegDB, вы можете получить большую производительность от их одновременного выполнения, а не при каждом вызове SaveChanges.

Поведение изоляции RegDB

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

Всякий раз, когда компонент, выполняющий работу внутри транзакции, вызывает любой метод, который приведет к записи в каталог COM+ ( например, SaveChanges, InstallApplicationили InstallComponent— блокировка записи принимается на сервере COM+ каталога, который блокирует любые другие записи, пока текущая транзакция не фиксирует или прерывает работу. То есть записи могут поступать только в том случае, если они имеют правильное сходство транзакций и участвуют в текущей транзакции.

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

Поведение SaveChanges

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

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

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

Период Time-Out транзакций

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

Ресурсы каталога, отличные от транзакций COM+

Реестр, файловая система и установщик Windows (MSI) — это ресурсы каталога COM+, которые не являются транзакционных.

Заметка

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

 

Если при установке существующего приложения COM+ из файла .msi возникает ошибка, приложение не отображается в оснастке "Службы компонентов", но оно может отображаться в программах "Добавление и удаление", в этом случае необходимо вручную удалить его.

Восстановление в событиях системных зависаний

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

Скриптирование с помощью объекта TransactionContext

Простой способ выполнения операций администрирования в транзакциях — использовать объект TransactionContext для управления транзакцией. Например, следующий скрипт Visual Basic демонстрирует, как транзакционно добавлять два новых приложения, чтобы оба приложения или ни одно приложение не создавалось:

Dim txctx
Dim cat
Dim apps
Dim app1
Dim app2
  
WScript.Echo "Starting"
Set txctx = CreateObject("TxCtx.TransactionContext")
Set cat = txctx.CreateInstance("COMAdmin.COMAdminCatalog")
Set apps = cat.GetCollection("Applications")
Set app1 = apps.Add
app1.Value("Name") = "Test App #1"
apps.SaveChanges
Set app2 = apps.Add
app2.Value("Name") = "Test App #2"
apps.SaveChanges
  
WScript.Echo "Ending"
txctx.Commit

обработка ошибок администрирования COM+

Вводный пример с помощью каталога администрирования COM+

обзор объектов COMAdmin

получение коллекций в каталога COM+

настройка свойств и сохранение изменений в каталога COM+