ルート オブジェクトに通知してトランザクションを高速化する
自動トランザクションを効果的に使用するには、各トランザクション コンポーネントが作業を完了したことを示す必要があります。 オブジェクト インスタンスがタスクを正常に完了したら、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
関連トピック