通过通知根对象加快事务速度
若要有效地使用自动事务,每个事务组件应指示已完成工作。 对象实例成功完成其任务后,应调用 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
相关主题