ルート オブジェクトへの通知によるトランザクションの高速化

自動トランザクションを効果的に使用するには、各トランザクション コンポーネントが作業を完了したと示す必要があります。 オブジェクト インスタンスは、タスクが正常に完了したら 、IObjectContext::SetComplete メソッドを呼び出して、一貫性のある完了フラグを True に設定する必要があります。 トランザクションのすべての内部オブジェクトが SetComplete を呼び出した場合 、SetComplete メソッドを呼び出してルート オブジェクトを明示的に非アクティブ化することで、トランザクションを終了できます。 ルート オブジェクトの処理が完了したことを明示的に示すので、トランザクションの長さを短縮できます。

トランザクション オブジェクト メソッドが失敗した場合、 オブジェクトは、IObjectContext::SetAbort メソッドを呼び出すことによって、一貫性のあるフラグを False に設定し、その完了フラグを True に設定する必要があります。 SetAbort メソッドを呼び出 すことによって、オブジェクトは呼び出し元に制御を返し、トランザクションが最終的に中止されます。

ただし 、SetAbort を呼び出すオブジェクトがトランザクションのルートである場合を指定しない限り、トランザクションは実行を継続します。ただし、最終的に中止しても何も保存されません。 失敗したトランザクションの終了を高速化するために、エラーを発生して 、SetAbort も呼び出すルート オブジェクトに警告することができます。 完了するには、ルート オブジェクトがクライアントにエラー メッセージを送信する必要があります。

エラーを処理するために実行できる方法は多数あるのに対し、内部オブジェクトとルート オブジェクトの間の通信を明確に調整する必要があります。

次のコード Visual Basicは、エラー処理の 1 つの方法を示しています。 最初のフラグメントでは、内部オブジェクトが 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

2 番目のフラグメントでは、ルート オブジェクトによってエラーが処理され、次のようにメッセージがクライアントに渡されます。

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+ での自動トランザクションの管理