Aceleración de transacciones mediante la notificación al 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 anule 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 no se pueda guardar nada para que se anule finalmente. 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 de 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
Temas relacionados