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

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

Если метод объекта транзакций завершается ошибкой, объект должен задать для его согласованного флага значение False, а его флаг выполнен значение True путем вызова метода IObjectContext::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+