ObjectContext オブジェクト |
バージョン 2.0 の ASP (Active Server Pages : アクティブサーバーページ) の重要な機能は、トランザクションスクリプトを作成できることです。このスクリプトの特徴は、その構成コードセグメントがすべてグループとして完全に成功または失敗することです。たとえば、このようなスクリプトを使用すると、コードの 1 つのセクションで在庫テーブルからレコードを削除し、2 番目のセクションでレコードを販売ログテーブルに追加できます。ただし、コードの両セクションが成功しない限り、スクリプト自身は成功しません。在庫レコードの削除または販売レコードの追加が失敗すると、スクリプト自身は失敗します。どちらのプロセスもロールバックされます。つまり、削除されたレコードは元どおりデータベースに追加され、追加された販売レコードは販売ログテーブルから削除されます。1 つのまとまりとして成功または失敗する単一のトランザクション単位の中に、複数の機能を入れられるこの機能は、ASP アプリケーション能力の重要な改良点です。以前のトランザクションは、すべてデータベースのトランザクションサポートに依存していました。 ASP アプリケーションのトランザクションは、 Windows 2000 COM+ Component Services または Windows NT の Microsoft Transaction Server (MTS) で制御されます。BackOffice スイートに属するこれらの製品を使用すると、コーティングされたすべてのデータベースアクションを制御できます。トランザクションスクリプトのサポートは、IIS と Personal Web Server に組み込まれており、特別なセットアップは不要です。COM+ Component Services または ASP 2.0 の MTS トランザクションサポートがなかった場合、アプリケーションでは、すべてのデータベース変更を手動で追跡し、すべてのデータベースアクションを手作業でロールバックして、マルチユーザーや並行性などの問題を管理する必要がありました。MTS または COM+ Component Services では、アプリケーションの接続先のデータベースが Microsoft SQL Server であるか、X/Open コンソーシアムの XA プロトコルをサポートしている限り、わずかのコーティングを追加するだけでこれをサポートできます。つまり、ファイルアクションはまだサポートされていないか、少なくとも自動的にサポートされていないことになります。 ASP によるトランザクションのサポートは、ObjectContext オブジェクトを使用してコーティングされます。このオブジェクトは、COM+ Component Services 自身の実際の ObjectContext オブジェクトを表します。ObjectContext オブジェクトのメソッドを呼び出し、そのイベントをコーティングすることで、わずかのコード行を追加するだけでトランザクションスクリプトを作成できます。 所定のページのスクリプトすべてをトランザクションと宣言するには、次のコード行をスクリプトの先頭行に追加します。
    <%@ TRANSACTION = Required %>
TRANSACTION ASP ディレクティブの詳細については、第 11 章を参照してください。ここで重要なことは、この行をスクリプトの先頭行にすることだけです。この行を追加すると、Web サーバーに対して、Component Services を使用してスクリプトを 1 つのまとまりとして成功または失敗させるように通知されます。 トランザクションをコミットまたは中断するには、それぞれ ObjectContext オブジェクトの SetComplete メソッドまたは SetAbort メソッドを呼び出します。Component Services でサポートされていないコードのセグメント (特にファイルアクション) を含む複雑なトランザクションを処理する場合、ObjectContext イベントの OnTransactionCommit および OnTransactionAbort 内に特別にこれらのアクションをコーティングできます。これらのメソッドとイベントプロシージャのすべての例については、本章の後のリファレンスセクションを参照してください。

コメントおよびトラブルシューティング |
現在のところ、トランザクションスクリプトを作成する際、次の 2 つの非常に重要な制限があります。 データベースアクションのみサポートされており、COM+ Component Services または MTS では、XA プロトコルをサポートしている SQL Server とデータベースのみサポートされています。 トランザクションは複数の ASP ページにまたがることができません。このため、ページの作成には十分な注意が必要です。ページには、トランザクションで必要なすべてのアクションを指定しますが、あまり大きくしすぎてページの処理が遅くならないようにする必要があります。 トランザクション内でデータベースアクションの一部またはすべてを完了する独自のサーバーコンポーネントを作成する場合、そのコンポーネントを MTS パッケージに登録する必要があります。MTS トランザクションがサポートされるのは、コンポーネントが登録されている場合のみです。さらに、独自の ライブラリパッケージを作成する必要があり、コンポーネントを IIS In-Process パッケージに含めないようにする必要があります。カスタムライブラリパッケージは、複数の ASP アプリケーションで使用でき、ASP DLL と同じプロセスで実行されます。また、ライブラリパッケージをセットアップすると、コンポーネントでこのパッケージをプールして、アプリケーションで再利用することもできます。このプールは MTS でも管理できます。コンポーネントをサーバーパッケージに追加することもできますが、それが必要なのは、ロールベースのトランザクションまたはリモートコンピュータ上で実行されるトランザクションに対してのみです。 ObjectContext オブジェクトとサーバーコンポーネントの詳細については、O'Reilly 社発行の Shelley Powers 著『Developing ASP Components』を参照してください。 トランザクションで動作中のオブジェクトにセッションまたはアプリケーションレベルのスコープを指定しないでください。トランザクションの最後に、トランザクションオブジェクトが無効になるためです。このようなオブジェクトにセッションまたはアプリケーションのスコープを指定すると、トランザクション終了後の呼び出しが失敗し、エラーが発生します。 トランザクションはデータベースアクションに対してのみサポートされていますが、OnTransactionCommit および OnTransactionAbort のイベントプロシージャにコードを追加して、データベース以外の独自のトランザクションをサポートできます。たとえば、これらのイベントプロシージャ内のコードを使用すると、指定トランザクションの成功または失敗時に、ファイルシステムに対してファイルの書き込みまたは削除を簡単に行うことができます。 ObjectContext は、ASP を介してアクセスできるメソッド以外に 6 つのメソッドを公開します。ただし、これらのメソッドにアクセスできるのは、COM+ Component Services または MTS で管理されるサーバーコンポーネント内のコード経由のみのため、ここでは説明しません。 トランザクションスクリプトは、ASP に対する非常に重要な追加機能です。ActiveX Data Objects の使用によってのみデータベーストランザクションにアクセスできる場合でも、それで非常に重要で役に立つ機能です。ただし、カスタムサーバーコンポーネントを作成すると、複雑で強力なトランザクションを作成できます。

SetAbort |
ObjectContext.SetAbort
トランザクション全体を中断します。このメソッドを呼び出すと、スクリプト内の処理済みまたは未処理のコードに無関係に、トランザクションは不成功で終了します。 このメソッドは、トランザクションの指定された部分の完了をテストした後にスクリプトで使用するか、MTS または COM+ Component Services が管理するサーバーコンポーネントで呼び出すことができます。SetAbort を呼び出すと、トランザクションの既に実行された部分がロールバックされ、スクリプトに ObjectContext_OnTransactionAbort イベントプロシージャが存在する場合、そのプロシージャが呼び出されます。
パラメータ
なし
例
    <%

    ' The following code tests the result from a method call
    ' to a custom server component that attempts to remove
    ' a book from the inventory table and then tests the
    ' results from a credit card check.

    ' Based on this code and the segment that follows it, the
    ' script will call either the SetAbort or the SetComplete
    ' method of the ObjectContext object.

    ' Attempt to sell 2 copies of the book Animal Farm.
    intBooks = MyInventory.SellBook("Animal Farm", 2)

    ' Check the credit card given by the client.
    intCheckCC = MyCreditChecker.ChkCard("0001231234")

    If intBooks = 2 And intCheckCC = 0 Then

       ' Complete the transaction. Two copies of the book
       ' are in the inventory and the credit card checks out.
       ObjectContext.SetComplete

    Else

       ' Abort the transaction. Either there are not two
       ' copies of the book in the inventory or the credit
       ' card did not check out.
       ObjectContext.SetAbort

    End If

    %>
メモ
トランザクションスクリプトの任意のセグメントが、SetAbort メソッドを呼び出すことができます。SetAbort 呼び出しの後にコードが存在する場合、このコードの処理は、OnTransactionAbort イベントプロシージャがあれば、そのプロシージャが実行されるまで行われません。このため、OnTransactionAbort イベントプロシージャで、トランザクションでサポートされていないアクション (特にファイルアクション) に必要なクリーンアップ作業が実行されることを確認してください。 SetAbort 呼び出しとは無関係にあるコードを処理する場合、そのコードがスクリプト内の SetAbort 呼び出しの前にあることを確認するか、スクリプト内のコードの後にあるトランザクションの完了をテストしてください。

SetComplete |
ObjectContext.SetComplete
トランザクションの正常な完了を通知します。このメソッドを呼び出すと、OnTransactionCommit イベントプロシージャが存在する場合、そのプロシージャ内のコードが処理されます。 スクリプト自身内から SetComplete メソッドが呼び出されても、そのページのスクリプトの成功が示されるだけです。スクリプトで参照されるコンポーネント内のコードが失敗しても、その失敗は無効になりません。スクリプト内のすべてのトランザクションコンポーネントが、SetComplete を通知してトランザクションをコミットする必要があります。
パラメータ
なし
例
前のセクション「SetAbort」の例を参照してください。
メモ
SetComplete が呼び出されても、必ずしもトランザクション全体が完了したことにはなりません。スクリプトから呼び出されたすべてのコンポーネントが、ObjectContext オブジェクトの SetComplete メソッドを呼び出す必要があります。 SetComplete を明示的に呼び出さない場合、SetAbort 呼び出しなしですべてのコードが処理された後にのみ、トランザクションが完了します。スクリプトの最後まで SetAbort 呼び出しが行われなかった場合、SetComplete が呼び出されたかどうかに無関係に、OnTransactionCommit イベントプロシージャコードがあれば、そのコードが処理されます。

OnTransactionAbort |
OnTransactionAbort( )
ObjectContext オブジェクトの SetAbort メソッドがスクリプトコードまたはスクリプトコードから呼び出されるサーバーコンポーネントによって明示的に呼び出されると、OnTransactionAbort イベントプロシージャがすぐに処理されます。SetAbort メソッドが呼び出されなければ、このイベントプロシージャは処理されません。
パラメータ
なし
例
    <%

    ' The following code procedure is processed when the code in
    ' the SetAbort method example is processed.
    Sub OnTransactionAbort ( )
    %>
       Your book sales transaction could not be completed.
       Either there was not sufficient inventory for your
       sale to be processed, or your credit card did not
       go through.
    <%
       ' Clean up any nontransactional actions here...

    End Sub

    %>
メモ
トランザクションが作成したサポートされていないアクションで、トランザクションが失敗した場合に元に戻す必要があるアクションをクリーンアップするには、OnTransactionAbort を使用します。この中には、変数 (セッションおよびアプリケーションレベルのスコープ)、レジストリ、およびファイルシステムに対する変更が含まれています。ただし、サーバーコンポーネントは、自分自身をクリーンアップする必要があります。 OnTransactionAbort イベントを使用して、トランザクションが失敗したことをクライアントに通知する必要もあります。 OnTransactionAbort イベントプロシージャから SetAbort メソッドまたは SetCommit メソッドを呼び出さないでください。呼び出すと、ループが導入され、アプリケーションの機能が失われるか、データが失われる可能性があります。

OnTransactionCommit |
OnTransactionCommit( )
ObjectContext オブジェクトの SetComplete メソッドがスクリプトコードまたはスクリプトコードから呼び出されるサーバーコンポーネントによって明示的に呼び出されると、OnTransactionCommit イベントプロシージャがすぐに処理されます。現在のページのスクリプトから SetAbort メソッドが呼び出されなかった場合にも、黙示的に呼び出されます。
パラメータ
なし
例
    <%

    ' The following code procedure is processed when the code in
    ' the SetComplete method example is processed.
    Sub OnTransactionCommit ( )
    %>
       Your book sales transaction was completed.
       Thank you for your sale.

    <%
       Session("intTotalSales") = Session("intTotalSales") + 1

       ' Process any nontransactional code here...

    End Sub

    %>
メモ
OnTransactionCommit イベントプロシージャを使用すると、クライアントにトランザクションの成功を通知できます。トランザクションが正常に完了した場合にのみ処理するコードにも、このプロシージャを使用できます。 OnTransactionCommit イベントプロシージャから SetAbort メソッドまたは SetCommit メソッドを呼び出さないでください。呼び出すと、ループが導入され、アプリケーションの機能が失われるか、データが失われる可能性があります。