Acelerando transações notificando o objeto raiz

Para usar transações automáticas efetivamente, 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 feitos como True chamando o método IObjectContext::SetComplete . Quando todos os objetos interiores 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 feito 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 anulada em última instância.

No entanto, a menos que o objeto que chama SetAbort seja a raiz da transação, a transação continuará sendo executada, embora 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 ao cliente.

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

Os fragmentos de código 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 o 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

Gerenciamento de transações automáticas em COM+