Speeding Transactions by Notifying the Root Object
To use automatic transactions effectively, each transactional component should indicate that it has completed its work. When an object instance completes its task successfully, it should set its consistent and done flags to True by calling the IObjectContext::SetComplete method. When all of the interior objects of the transaction have called SetComplete, the transaction can be terminated by explicitly deactivating the root object by calling its SetComplete method. By explicitly indicating that a root object has completed its work, you can reduce the length of the transaction.
When a transactional object method fails, the object should set its consistent flag to False and its done flag to True by calling the IObjectContext::SetAbort method. By calling the SetAbort method, an object returns control to its caller and ensures that the transaction is ultimately aborted.
However, unless the object calling SetAbort is the root of the transaction, the transaction continues to run even though nothing can save it from eventually aborting. To speed up the termination of a failed transaction, you can raise an error to alert the root object to also call SetAbort. For completion, the root object should then send an error message to its client.
While there are many different approaches you can take to handle errors, your approach should clearly coordinate the communications between interior objects and the root object.
The following Visual Basic code fragments show one approach to error handling. In the first fragment, an interior object calls SetAbort, raises an error, and generates an error message, as follows:
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
In the second fragment, the root object handles the error and passes the message to its client, as follows:
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