Acelerando transações notificando o objeto raiz

Para usar transações automáticas de forma eficaz, cada componente transacional deve indicar que concluiu seu trabalho. Quando uma instância de objeto conclui sua tarefa com êxito, ela deve definir seus sinalizadores consistentes e concluídos como True chamando o método IObjectContext::SetComplete . Quando todos os objetos internos da transação tiverem chamado SetComplete, a transação poderá ser encerrada desativando explicitamente o objeto raiz chamando seu método SetComplete. Ao indicar explicitamente que um objeto raiz concluiu seu trabalho, você pode reduzir o comprimento da transação.

Quando um método de objeto transacional falha, o objeto deve definir seu sinalizador consistente como False e seu sinalizador done como True chamando o método IObjectContext::SetAbort . Ao chamar o método SetAbort, um objeto retorna o controle para seu chamador e garante que a transação seja finalmente anulada.

No entanto, a menos que o objeto que chama SetAbort seja a raiz da transação, a transação continua a ser executada mesmo que nada possa salvá-la de eventualmente abortar. Para acelerar o encerramento de uma transação com falha, você pode gerar um erro para alertar o objeto raiz para também chamar SetAbort. Para conclusão, o objeto raiz deve enviar uma mensagem de erro para seu cliente.

Embora existam muitas abordagens diferentes que você pode adotar para lidar com erros, sua abordagem deve coordenar claramente as comunicações entre objetos internos e o objeto raiz.

Os fragmentos de código do Visual Basic a seguir mostram uma abordagem para o tratamento de erros. No primeiro fragmento, um objeto interior chama SetAbort, gera um erro e gera uma mensagem de erro, da seguinte maneira:

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

No segundo fragmento, o objeto raiz manipula o erro e passa a mensagem para seu cliente, da seguinte maneira:

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

Gerenciando transações automáticas no COM+