Ускорение транзакций путем уведомления корневого объекта

Чтобы эффективно использовать автоматические транзакции, каждый компонент транзакции должен указать, что он завершил свою работу. Когда экземпляр объекта успешно завершает свою задачу, он должен установить для флагов consistent и Done значение true, вызвав метод иобжектконтекст:: сеткомплете . Когда все внутренние объекты транзакции называются сеткомплете, транзакция может быть завершена путем явной деактивации корневого объекта путем вызова его метода сеткомплете . Путем явного указания на то, что корневой объект завершил свою работу, можно уменьшить длину транзакции.

При сбое метода объекта транзакции объект должен установить флаг согласованности в значение false, а флаг Done — в значение true, вызвав метод иобжектконтекст:: SetAbort . Вызывая метод SetAbort , объект возвращает управление вызывающему объекту и гарантирует, что транзакция в конечном итоге прерывается.

Однако, если объект, вызывающий SetAbort , не является корнем транзакции, транзакция продолжит выполняться, даже если она не может сохранить ее в конечном итоге. Чтобы ускорить завершение невыполненной транзакции, можно вызвать ошибку, чтобы создать предупреждение для корневого объекта, чтобы также вызвать SetAbort. По завершении корневой объект должен отправить клиенту сообщение об ошибке.

Хотя существует множество различных подходов к обработке ошибок, подход должен четко координировать обмен данными между внутренними объектами и корневым объектом.

В следующих фрагментах кода Visual Basic показан один из подходов к обработке ошибок. В первом фрагменте внутренний объект вызывает SetAbort, вызывает ошибку и выдает сообщение об ошибке следующим образом:

Dim ObjCtx As ObjectContext
Dim ErrorCode As Long, Description As String

Set ObjCtx = GetObjectContext()
ObjCtx.SetAbort
ErrorCode = vbObjectError + 5
Description = "Some meaningful message"
Err.Raise ErrorCode, , Description

Во втором фрагменте корневой объект обрабатывает ошибку и передает сообщение клиенту, как показано ниже.

Sub MyObjMethod1()
  On Error GoTo MyObjMethod1_err
  Dim ObjCtx As ObjectContext
  Dim InteriorObj1 As Cinterior  ' Cinterior is a user-defined object.

  Set ObjCtx = GetObjectContext()
  Set InteriorObj1 = CreateObject ("MyDll.Cinterior")
  InteriorObj1.Method1
  ' If the call completed successfully, then...
  ObjCtx.SetComplete
Exit Sub
  MyObjMethod1_err:
  ' Doom the transaction and exit.
  ObjCtx.SetAbort
  ' Pass the message back to client.
  Err.Raise Err.Number, , Err.Description
End Sub

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