Шаг 1. Создание компонента транзакций
На этом шаге вы узнаете следующее:
- Запись транзакционного компонента в Microsoft Visual Basic
- Параметры по умолчанию для служб COM+
- Настройка служб COM+
Компонент UpdateAuthorAddress, созданный в этом разделе, обновляет адрес существующего автора в базе данных Pubs. База данных Pubs — это пример базы данных, которая поставляется с Microsoft SQL Server. Она содержит сведения о публикации, такие как имена авторов, адреса и названия книг.
Примечание
Pubs — это хранилище данных, используемое на протяжении всего этого праймера.
Поскольку UpdateAuthorAddress обновляет хранилище данных, рекомендуется включить работу в транзакцию, чтобы при вызове компонента клиент COM+ автоматически запустит транзакцию и включит базу данных (менеджер ресурсов) в эту транзакцию, как показано на следующем рисунке. (Подробные сведения о транзакциях в COM+см. в разделе COM+ Transactions.)
Чтобы сделать UpdateAuthorAddress компонентом транзакций, необходимо выполнить следующие действия:
Компонент должен быть записан в память. Для дополнительной защиты добавляется подзадача, проверяющая, что COM+ создал объект в транзакции. Кроме того, базовая обработка ошибок включается в компонент для упрощения восстановления ошибок. Проверка транзакций и обработка ошибок повышают надежность компонента. (Полный перечень компонента UpdateAuthorAddress см. на шаге 1).
После добавления компонента в приложение 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 и службы защиты параллелизма для компонентов транзакций.
- Закрытие подключения к базе данных при завершении работы позволяет другому компоненту в той же транзакции повторно использовать подключение из пула соединений. (Пул соединений не следует путать с пулом объектов.)