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


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

Для эффективного использования автоматических транзакций каждый компонент транзакций должен указать, что он завершил свою работу. После успешного завершения задачи экземпляр объекта должен установить флаги согласованности и завершения в 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+