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


Шаг 2. Расширение транзакции между компонентами

Задачи

На этом шаге вы узнаете следующее:

  • Поток транзакций
  • Как несколько объектов голосуют в транзакции

Description

Шаг 1. Создание компонента транзакций показывает, как написать простой компонент транзакций, который обновляет сведения автора в базе данных Microsoft SQL Server Pubs. На шаге 2 показано, что происходит при расширении транзакции между несколькими компонентами.

В соответствии с моделью UpdateAuthorAddress программирования COM+ вызывает другой компонент в ходе выполнения своей работы. Второй компонент, ValidateAuthorAddressпроверяет адрес автора и возвращает результаты вызывающей объекту UpdateAuthorAddress.

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

Схема, показывающая расширение существующей транзакции до нового объекта.

Поддерживаемое значение атрибута расширяет (или потоки) существующей транзакции, только если вызывающий объект является транзакциональным. При UpdateAuthorAddress вызовах ValidateAuthorAddressCOM+ сначала просматривает контекст вызывающего объекта, чтобы узнать, является ли он транзакциональным. ЗАТЕМ COM+ проверяет атрибуты службы, заданные ValidateAuthorAddress и присваивающие новому объекту тот же идентификатор транзакции, который назначается объекту вызывающего объекта. Дополнительные сведения об этом процессе см. в разделе "Активация контекста".

Так как они совместно используют один и тот же идентификатор транзакции, оба объекта должны успешно завершить работу или COM+ прервать транзакцию (отменяя любые изменения, внесенные в базу данных Pubs).

Все объекты, участвующие в голосовании транзакций, либо фиксируют, либо прерывают транзакцию. Голосование происходит явно при включении инструкций голосования в код, как показано в следующем извлечении из примера кода шага 1, который создает UpdateAuthorAddress компонент:

  ' Everything works.
  contextstate.SetMyTransactionVote TxCommit
  contextstate.SetDeactivateOnReturn True
  Exit Sub
  
UnexpectedError:
  ' There's an error.
  contextstate.SetMyTransactionVote TxAbort
  contextstate.SetDeactivateOnReturn True

Голосование также происходит неявно, как и в компоненте ValidateAuthorAddress . Если объект не объявляет в противном случае, COM+ предполагает успешное завершение работы объекта, но оно не готово к деактивации. COM+ делает следующее предположение:

  contextstate.SetMyTransactionVote TxCommit
  contextstate.SetDeactivateOnReturn False

Когда ValidateAuthorAddress возвращается вызывающей объекту, COM+ считывает свой голос как фиксацию. COM+ не подсчитывает голоса, пока он не деактивирует корневой объект, который является первым объектом в транзакции в данном случае, UpdateAuthorAddress объектом.

Пример кода

Компонент ValidateAuthorAddress выполняет простую проверку адреса автора. Так как UpdateAuthorAddress не голосует явно, COM+ использует параметры голосования по умолчанию.

Option Explicit
'
'   Purpose:   This class is used for validating an author's address
'              (presumably right before updating that address in the
'              database).
'
'   Notes:   This component could be in a transaction or not; it doesn't 
'            matter because it doesn't touch any data in a database.
'
Public Function ValidateAuthorAddress( _
                        ByVal strAddress As String, _
                        ByVal strCity As String, _
                        ByVal strState As String, _
                        ByVal strZip As String) As Boolean
  ' Default is to validate unless something is found to be wrong.
  ValidateAuthorAddress = True
                                                  
  '  Invalidate authors who live in New York City
  '  and authors who live in Montana.
  '
  If strCity = "New York" And strState = "New York" Then
    ValidateAuthorAddress = False
  ElseIf strState = "Montana" Then
    ValidateAuthorAddress = False
  End If
  ' Done
End Function

Итоги

  • Задание атрибута транзакции компонента в значение Supported может привести к созданию нового объекта в транзакции вызывающего объекта. COM+ проверяет контекст вызывающего объекта, чтобы определить состояние транзакции нового объекта. Если вызывающий объект является транзакциональным, COM+ передает транзакцию новому объекту.

  • Все объекты, участвующие в одной транзакции, имеют общий идентификатор транзакции, который COM+ считывает из контекста объекта.

  • Каждый объект в транзакции голосует независимо от других объектов. COM+ подсчитывает голоса при деактивации корневого объекта.

  • Вы можете переключать голосование транзакций объекта между фиксацией и прерыванием, пока COM+ не деактивирует объект или пока COM+ не деактивирует корневой объект и завершает транзакцию. Счетчики только последних параметров голосования. Интерфейсы IContextState и IObjectContext предоставляют методы и создают аналогичные результаты голосования, как показано в следующей таблице. Вы можете использовать любой интерфейс для явного голосования в транзакции.

    Методы сочетания IContextState Эквивалентный метод IObjectContext
    SetMyTransactionVote txVote = TxCommit
    SetDeactivateOnReturn bDeactivate = True
    SetComplete
    SetMyTransactionVote txVote = TxCommit
    SetDeactivateOnReturn bDeactivate = False
    EnableCommit
    SetMyTransactionVote txVote = TxAbort
    SetDeactivateOnReturn bDeactivate = True
    SetAbort
    SetMyTransactionVote txVote = TxAbort
    SetDeactivateOnReturn bDeactivate = False
    DisableCommit
  • COM+ задает голос объекта эквиваленту EnableCommit , если компонент явно не голосовает.

  • Голосование явно может сократить общую продолжительность транзакции и освободить дорогостоящие блокировки ресурсов.

Шаг 1. Создание компонента транзакций

Шаг 3. Повторное использование компонентов

Активация контекста

Управление автоматическими транзакциями в COM+