I ran into this myself recently and I think its because when COM+ components running in a transactions context call the "setABORT" method, then the transaction is considered "no good" anymore. So, maybe what is happening is the transaction context does not allow further processing?
That is what it looks like to me.
Also, make sure you use CreateObject and not the NEW keyword when creating new objects you have written that are subordinate to the transaction context.
For example, lets say we have 3 classes
clsROOT (has transaction required)
clsUpdate1 (updates database 1)
clsUpdate2 (updates database 2)
clsROOT
public Sub CallUpdates
dim objUPDATE1 as clsUpdate1
dim objUPDATE2 as clsUpdate2
set objUPDATE1 = CreateObject("YOURDLL.clsUpdate1"

set objUPDATE2 = CreateObject("YOURDLL.clsUpdate2"

' now lets say we call the update method of clsupdate1
objupdate1.Update
'and lets say that objupdate1 had an error and
'it called getobjectContext.setabort()
'At this point, I would get the method ~ of
'object ~ 'failed error prior to being able
'to call the objUpdate2.update
objUpdate2.Update
end sub
There are some references on msdn to it being caused by visual basic calling "into the failed object" again to get extended error information, but the solution to that was to apply the latest service pack (which I already had).
At any rate, as I said its almost as if the "set abort" in this example, invalidated the transaction context, thus COM+ decided since the transaction is invalidated, to stop allowing calls to that transaction context.
I solved it by raising an error to clsROOT from the subordinate class modules when an error is called (and after setabort was called by the subordinate class module).
to make this clearer...
clsUPDATE1
public sub Update()
on error goto errhandler:
'also you should explicitly call the disablecommit
'method of object context priot to update processing.
'processing goes here
exit sub
errhandler:
GetObjectContext.setAbort 'abort com+ transaction
err.raise 99999, "COM+ transaction failed"
end sub
'now as long as you have an error handler in the root object to "catch" the failed error, it will correctly abort and also not attempt to call any more methods in the routine.
'for example, this is the root object now
public sub CallUpdates
on error goto errhandler:
dim objUPDATE1 as clsUpdate1
dim objUPDATE2 as clsUpdate2
set objUPDATE1 = CreateObject("YOURDLL.clsUpdate1"

set objUPDATE2 = CreateObject("YOURDLL.clsUpdate2"

' now lets say we call the update method of clsupdate1
objupdate1.Update
'and lets say that objupdate1 had an error and
'it called getobjectContext.setabort()
'At this point, I would get the method ~ of
'object ~ 'failed error prior to being able
'to call the objUpdate2.update
objUpdate2.Update
exit sub
errhandler:
msgbox "com+ component was aborted."
end sub
Hope this helps, sorry if I didnt explain it so well, but that is what it appeared to happen to me in regards to this.
Whats weird is the COM+ documentation does not seem to make an explicit reference to having to "raise an error and catch it the root object".
Anybody care to join in here?
Thanks...
Gilbert M. Vanegas
Programmer Analyst III
County of San Bernardino - ISD
Email : gvanegas@isd.sbcounty.gov