ルート オブジェクトに通知してトランザクションを高速化する

自動トランザクションを効果的に使用するには、各トランザクション コンポーネントが作業を完了したことを示す必要があります。 オブジェクト インスタンスがタスクを正常に完了したら、 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+ での自動トランザクションの管理