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