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


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

Задачи

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

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

Description

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

Примечание.

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

 

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

Diagram that shows a COM+ transaction with UpdateAuthorAddress.

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

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

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

    Примечание.

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

     

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+ JIT

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

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

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

Настройка атрибута транзакции