Использование не транзакционных компонентов в транзакции
Часто полезно поместить не транзакционные компоненты в транзакцию, чтобы воспользоваться свойствами ACID транзакций. Например, если у вас есть устаревшие компоненты, не относящиеся к транзакциям, которые используются для обновления паролей в сети, эти компоненты можно поместить в транзакцию, чтобы обеспечить согласованность обновлений паролей в сети.
Объект контекста транзакций — это универсальный объект, позволяющий клиентам без транзакций объединять работу нескольких COM-объектов в одну транзакцию, не требуя разработки нового компонента специально для этой цели. В отличие от автоматической транзакции, объект контекста транзакции требует, чтобы его клиент явно зафиксировать или прервать транзакцию.
По умолчанию значение атрибута транзакции объекта контекста транзакции имеет значение "Обязательный". COM+ прерывает транзакцию, если клиент освобождает объект контекста транзакции без явного вызова фиксации или прерывания.
В следующем примере Visual Basic показано, как не транзакционный клиент может создавать работу, выполняемую несколькими объектами, в одну транзакцию:
Dim objTxCtx As TransactionContext
Dim objCat As MyDLL.Ccat ' Ccat is a user-defined component.
Dim objDog As MyDLL.Cdog ' Cdog is a user-defined component.
' Get TransactionContext object.
Set objTxCtx = _
CreateObject ("TxCtx.TransactionContext")
' Create instances of Cat and Dog.
Set objCat = _
objTxCtx.CreateInstance ("MyDLL.Ccat")
Set objDog = _
objTxCtx.CreateInstance ("MyDLL.Cdog")
' Both objects do work.
objDog.Bark
objCat.Hiss
' Commit the transaction.
objTxCtx.Commit
Ограничения объекта контекста транзакции
Ниже приведены некоторые важные ограничения объекта контекста транзакции:
При использовании объекта контекста транзакций логика приложения, которая объединяет работу нескольких объектов в одну транзакцию, привязана к определенной реализации клиента, отличной от транзакций, и некоторые преимущества использования COM-компонентов теряются. К этим потерянным преимуществам относятся следующие:
- Возможность повторного использования логики приложения в рамках еще более крупной транзакции
- Применение декларативной безопасности
- Гибкость удаленного выполнения логики от клиента
Объект контекста транзакции выполняется в процессе с клиентом, не имеющим транзакций, что означает, что COM+ должен быть доступен на клиентском компьютере, отличном от транзакций. Это может не быть проблемой, например, если объект контекста транзакции используется на странице Active Server Pages (ASP), работающей на том же сервере, что и COM+.
При создании объекта контекста транзакции не получается для клиента, не относяющегося к транзакциям. Транзакционная работа может выполняться косвенно через COM-объекты, созданные с помощью объекта контекста транзакции. В частности, не транзакционный клиент не может использовать диспенсеры ресурсов COM+ (например, ODBC) и включить работу в транзакцию. Например, разработчики могут ознакомиться со следующим синтаксисом для выполнения транзакционной работы в системах реляционных баз данных:
BEGIN TRANSACTION DoWork COMMIT TRANSACTION
Использование объекта контекста транзакции аналогичным образом не дает требуемого результата:
Set objTxCtx = CreateObject ("TxCtx.TransactionContext") DoWork objTxCtx.Commit Set objTxCtx = Nothing
Вызов DoWork в этом примере не включен в транзакцию. Вместо этого необходимо создать COM-компонент, который вызывает DoWork, создать экземпляр объекта этого компонента с помощью объекта контекста транзакции, а затем вызвать этот объект из неза транзакционного клиента, чтобы работа была частью управляемой клиентом клиента.