Прочитать на английском

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


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

Цели

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

  • Запись транзакционного компонента в Microsoft Visual Basic
  • Параметры по умолчанию для служб COM+
  • Настройка служб COM+

Описание

Компонент UpdateAuthorAddress, созданный в этом разделе, обновляет адрес существующего автора в базе данных Pubs. База данных Pubs — это пример базы данных, которая поставляется с Microsoft SQL Server. Она содержит сведения о публикации, такие как имена авторов, адреса и названия книг.

Примечание

Pubs — это хранилище данных, используемое на протяжении всего этого праймера.

 

Поскольку UpdateAuthorAddress обновляет хранилище данных, рекомендуется включить работу в транзакцию, чтобы при вызове компонента клиент COM+ автоматически запустит транзакцию и включит базу данных (менеджер ресурсов) в эту транзакцию, как показано на следующем рисунке. (Подробные сведения о транзакциях в COM+см. в разделе COM+ Transactions.)

диаграмма, показывающая транзакцию COM+ с UpdateAuthorAddress.

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

  1. Компонент должен быть записан в память. Для дополнительной защиты добавляется подзадача, проверяющая, что COM+ создал объект в транзакции. Кроме того, базовая обработка ошибок включается в компонент для упрощения восстановления ошибок. Проверка транзакций и обработка ошибок повышают надежность компонента. (Полный перечень компонента UpdateAuthorAddress см. на шаге 1).

  2. После добавления компонента в приложение COM+ и установки приложения атрибут транзакции должен быть установлен на Обязательное, что гарантирует, что COM+ создает каждый объект UpdateAuthorAddress в транзакции. Инструкции по настройке атрибута транзакции для компонента см. в настройке атрибута транзакции.

    Примечание

    Задание атрибута транзакции в компоненте определяет, как COM+ создает каждый объект в отношении транзакций. Значения атрибутов транзакций: игнорируется, не поддерживается, поддерживается, требуетсяи требует новое. Значение Required не является одним из атрибутов по умолчанию компонента.

     

COM+ привязывает службу транзакций с JIT-активацией и параллелизмом. При объявлении компонента транзакционным COM+ также обеспечивает JIT-активацию и защиту параллелизма (синхронизацию).

Пример кода

Компонент UpdateAuthorAddress открывает подключение к базе данных Pubs, что позволяет пользователю изменять имя автора, адрес или состояние контракта. Он также вызывает второй компонент, который рассматривается в шаге 2 : Расширение транзакции между несколькими компонентами.

Чтобы использовать следующий код в проекте Microsoft Visual Basic, откройте новый проект ActiveX.dll и добавьте ссылки на библиотеку объектов данных Microsoft ActiveX и библиотеку типов служб COM+.

Примечание

Пример кода в этом руководстве предназначен для иллюстрации и может быть не самым эффективным для стадии тестирования и производства.

 

Option Explicit
'
'  Purpose:   This class is used for updating an author's address.
'
'  Notes:     IMPT:  This component implicitly assumes that it will 
'             always run in a transaction. Undefined results may 
'             otherwise occur.
'

'----------------------------------------------------------
'  VerifyInTxn subroutine
'      Verifies that this component is in a transaction.
'      Throws an error if it is not.
'
Private Sub VerifyInTxn()
  If Not GetObjectContext.IsInTransaction Then
    ' Transactions turned off. 
    Err.Raise 99999, "This component", "I need a transaction!"
  End If
  ' Component is in a transaction.
End Sub

'----------------------------------------------------------
'  UpdateAuthorAddress subroutine
'      Procedure to update an author's address.
'
Public Sub UpdateAuthorAddress( _
                        ByVal strAuthorID As String, _
                        ByVal strPhone As String, _
                       ByVal strAddress As String, _
                        ByVal strCity As String, _
                        ByVal strState As String, _
                        ByVal strZip As String)
  ' Handle any errors.
  On Error GoTo UnexpectedError
  
  ' Verify that component is in a transaction.
  VerifyInTxn
  
  ' Get object context.
  Dim objcontext As COMSVCSLib.ObjectContext
  Set objcontext = GetObjectContext
  
  ' Get the IContextState object.
  Dim contextstate As COMSVCSLib.IContextState
  Set contextstate = objcontext
  
  ' Validate the new address information.
  ' The ValidateAuthorAddress function is described in Step 2.
  Dim oValidateAuthAddr As Object
  Dim bValidAddr As Boolean
  Set oValidateAuthAddr = _
    CreateObject("ComplusPrimer.ValidateAuthorAddress") 
  bValidAddr = oValidateAuthAddr.ValidateAuthorAddress( _
    strAddress, strCity, strState, strZip)
  If Not bValidAddr Then
    Err.Raise 99999, "The UpdateAuthorAddress component", _
      "The address of the author is incorrect!"
  End If
  
  ' Open the connection to the database.
  Dim conn As ADODB.Connection
  Set conn = CreateObject("ADODB.Connection")

  ' Specify the OLE DB provider.
  conn.Provider = "SQLOLEDB"

  ' Connect using Windows Authentication.
  Dim strProv As String
  strProv = "Server=MyDBServer;Database=pubs;Trusted_Connection=yes"

  ' Open the database.
  conn.Open strProv

  ' Execute the query.
  conn.Execute "update authors set phone= '" & strPhone & "'" & _
               " set address= '" & strAddress & "'" & _
               " set city= '" & strCity & "'" & _
               " set state= '" & strState & "'" & _
               " set zip= '" & strZip & "'" & _
               " where au_id = '" & strAuthorID & "'"
               
  ' Close the connection.
  conn.Close
  
  ' Get rid of the connection.
  Set conn = Nothing
                 
  ' Everything works--commit the transaction.
  contextstate.SetMyTransactionVote TxCommit
  contextstate.SetDeactivateOnReturn True
  Exit Sub
  
UnexpectedError:
  ' There's an error.
  contextstate.SetMyTransactionVote TxAbort
  contextstate.SetDeactivateOnReturn True
End Sub

Сводка

  • COM+ назначает значения атрибутов по умолчанию. Вы можете перенастроить большинство атрибутов службы.
  • Задание атрибута транзакции компонента на Обязательное гарантирует, что COM+ должен создавать каждый экземпляр этого компонента в транзакции, но не обязательно запускает новую транзакцию.
  • Проверка наличия транзакции подтверждает, что значение атрибута транзакции компонента не было непреднамеренно сброшено на нетранзакционное значение, например Игнорировать или Не поддерживается.
  • Обработка ошибок делает компонент более надежным и удобным для устранения неполадок.
  • COM+ применяет активацию JIT и службы защиты параллелизма для компонентов транзакций.
  • Закрытие подключения к базе данных при завершении работы позволяет другому компоненту в той же транзакции повторно использовать подключение из пула соединений. (Пул соединений не следует путать с пулом объектов.)

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

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

COM+ активация по требованию

Синхронизация COM+

настройка транзакций

создание приложений COM+

задание атрибута транзакции