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


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

Задачи

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

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

Описание

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

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

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

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

Поддерживаемое значение атрибута расширяет (или передает) существующую транзакцию, только если вызывающий объект является транзакционным. UpdateAuthorAddress вызывает ValidateAuthorAddress, COM+ сначала просматривает контекст вызывающего объекта, чтобы узнать, является ли он транзакционным. Затем 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
    SetMyTransactionVotetxVote = TxCommit
    SetDeactivateOnReturnbDeactivate = True
    SetComplete
    SetMyTransactionVotetxVote = TxCommit
    SetDeactivateOnReturnbDeactivate = False
    EnableCommit
    SetMyTransactionVotetxVote = TxAbort
    SetDeactivateOnReturnbDeactivate = True
    SetAbort
    SetMyTransactionVote txVote = TxAbort
    SetDeactivateOnReturnbDeactivate = False
    Отключить коммит
  • COM+ задает голос объекта эквиваленту EnableCommit , если компонент явно не голосовает.

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

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

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

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

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