Acelerar las transacciones mediante la notificación del objeto raíz

Para usar transacciones automáticas de forma eficaz, cada componente transaccional debe indicar que ha completado su trabajo. Cuando una instancia de objeto completa correctamente su tarea, debe establecer sus marcas coherentes y finalizadas en True llamando al método IObjectContext::SetComplete . Cuando todos los objetos interiores de la transacción han llamado a SetComplete, la transacción se puede terminar desactivando explícitamente el objeto raíz llamando a su método SetComplete . Al indicar explícitamente que un objeto raíz ha completado su trabajo, puede reducir la longitud de la transacción.

Cuando se produce un error en un método de objeto transaccional, el objeto debe establecer su marca coherente en False y su marca finalizada en True llamando al método IObjectContext::SetAbort . Al llamar al método SetAbort , un objeto devuelve el control a su llamador y garantiza que la transacción se anula en última instancia.

Sin embargo, a menos que el objeto que llama a SetAbort sea la raíz de la transacción, la transacción continúa ejecutándose aunque nada pueda guardarlo para anularla. Para acelerar la finalización de una transacción con errores, puede generar un error para alertar al objeto raíz para llamar también a SetAbort. Para finalizar, el objeto raíz debe enviar un mensaje de error a su cliente.

Aunque hay muchos enfoques diferentes que puede adoptar para controlar los errores, el enfoque debe coordinar claramente las comunicaciones entre los objetos interiores y el objeto raíz.

Los siguientes fragmentos de código Visual Basic muestran un enfoque para el control de errores. En el primer fragmento, un objeto interior llama a SetAbort, genera un error y genera un mensaje de error, como se indica a continuación:

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

En el segundo fragmento, el objeto raíz controla el error y pasa el mensaje a su cliente, como se indica a continuación:

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

Administración de transacciones automáticas en COM+