通过通知根对象加快事务速度

若要有效地使用自动事务,每个事务组件应指示已完成工作。 对象实例成功完成其任务后,应调用 IObjectContext::SetComplete 方法来将其一致和完成标志设置为 True。 当事务的所有内部对象都调用了 SetComplete 时,可以调用其 SetComplete 方法来显式停用根对象,以便终止该事务。 通过显式指示根对象已完成其工作,可以减少事务的长度。

当事务对象方法失败时,该对象应调用 IObjectContext::SetAbort 方法,将其一致标志设置为 False,并将其完成标志设置为 True。 通过调用 SetAbort 方法,对象可将控制权返回给其调用方,并确保最终中止事务。

但是,除非调用 SetAbort 的对象是事务的根对象,否则该事务将继续运行,即使最终无法将其终止也是如此。 若要加快失败事务的终止速度,可以引发错误以提醒根对象也调用 SetAbort。 若要完成,根对象接着应向其客户端发送错误消息。

虽然可以采用许多不同的方法来处理错误,但方法应清楚地协调内部对象和根对象之间的通信。

以下 Visual Basic 代码片段显示了一种错误处理方法。 在第一个片段中,内部对象调用 SetAbort、引发错误并生成错误消息,如下所示:

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

在第二个片段中,根对象处理错误并将消息传递给其客户端,如下所示:

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

在 COM+ 中管理自动事务