ASP講座シリーズ(21) トランザクションスクリプトの作成
著者:Eve Cole
更新時間:2009-05-30 19:58:32
ビジネス アプリケーションでは、多くの場合、トランザクション内でスクリプトやコンポーネントを実行する機能が必要になります。トランザクションはサーバー操作です。操作に多くのステップ (注文、在庫の確認、請求書の支払いなど) が含まれている場合でも、返されるのは操作全体の成功または失敗だけです。ユーザーは、トランザクション内で実行される ASP スクリプトを作成できます。スクリプトの一部が失敗すると、トランザクション全体が終了します。
ASP トランザクション処理は、Microsoft Transaction Server (MTS) に基づいています。 Microsoft Transaction Server (MTS) は、高性能、スケーラブル、堅牢なエンタープライズ インターネットおよびイントラネット サーバー アプリケーションを開発、構成、管理するためのトランザクション処理システムです。 Transaction Server は、コンポーネントベースの分散アプリケーションを開発するためのアプリケーション設計モデルを提供します。また、これらのアプリケーションを構成および管理するためのランタイム環境も提供します。
トランザクション スクリプトを作成する機能は、Internet Information Server および Personal Web Server に組み込まれています。 Microsoft Transaction Server がインストールされている場合は、トランザクション内で実行されるようにコンポーネントをパッケージ化できます。
トランザクションについて トランザクションとは、操作の全体的な成功または失敗です。データベースを確実に更新するためにトランザクション処理が使用されます。データベースに多くの関連する変更を加えたり、複数のデータベースを同時に更新したりする場合は、すべての変更が正しく実行されていることを確認してください。これらの変更のいずれかが失敗した場合は、データベース テーブルの元の状態を復元する必要があります。
MTS を使用しない場合、一部の変更が失敗した場合にデータを回復するために、要求された変更を手動で追跡するスクリプトとコンポーネントを作成する必要があります。 MTS を使用すると、スクリプトとコンポーネントを「必要なトランザクション」として宣言するだけで、MTS にトランザクションの一貫性を処理させます。トランザクション処理はデータベース アクセスにのみ適用され、MTS はファイル システムやその他の非トランザクション リソースへの変更を回復できません。アプリケーションがアクセスするデータベースは MTS でサポートされている必要があります。現在、MTS は SQL Server と、XA プロトコル (X/Open Association によって指定) をサポートするサーバーをサポートしています。 MTS は引き続き他のデータベースのサポートを拡大していきます。
トランザクションは複数の ASP ページにまたがることはできません。トランザクションで複数のコンポーネントのオブジェクトが必要な場合、これらのオブジェクトを使用する操作を ASP ページ内で組み合わせる必要があります。たとえば、給与データベースを更新するコンポーネントと、人事データベースの従業員レコードを更新するコンポーネントがあるとします。従業員の新しい給与情報を記録するには、トランザクション コンテキストでこれら 2 つのコンポーネントを呼び出すスクリプトを作成する必要があります。1 つは給与データベースを更新し、もう 1 つは人事データベースの従業員の等級を更新します。
トランザクション スクリプトの宣言 ページをトランザクションとして宣言すると、ページ内のすべてのスクリプト コマンドとオブジェクトが同じトランザクション環境で実行されます。 Transaction Server は、トランザクション生成の詳細を処理し、トランザクションが成功 (コミット) するか失敗 (終了) するかを判断します。ページをトランザクションとして宣言するには、ページの先頭に @TRANSACTION ディレクティブを追加します。
<%@ トランザクション = 値 %>
value パラメータは次のいずれかになります。
値の意味
Requires_New は新しいトランザクションを開始します。
Required は新しいトランザクションを開始します。
サポートされている場合はトランザクションを開始しません。
Not_Supported トランザクションを開始しません。
@TRANSACTION ディレクティブはページの最初の行になければなりません。そうしないとエラーが生成されます。このディレクティブは、トランザクションで実行する必要があるすべてのページに追加する必要があります。スクリプトの処理が終了すると、現在のトランザクションが終了します。
ほとんどのアプリケーションは、特定の操作にのみトランザクション環境を必要とします。たとえば、航空会社のサイトでは、発券と座席の手配を処理するためのトランザクション スクリプトのみが必要ですが、他のすべてのスクリプトはトランザクション環境がなくても安全に実行できます。トランザクションはトランザクション処理が必要なページにのみ使用する必要があるため、アプリケーションの Global.asa ファイルをトランザクションとして宣言しないでください。
トランザクションが中止されると、Transaction Server はトランザクションに基づくリソースへの変更を元に戻します。データベース内のデータはエンタープライズ アプリケーションにとって最も重要であるため、現在、トランザクションを完全にサポートしているのはデータベース サーバーのみです。 Transaction Server は、ハード ディスク上のファイル、セッション変数、アプリケーション変数、コレクションなどへの変更を復元しません。ただし、次のトピックで説明するように、トランザクション イベントを記述することで、変数とコレクションの復元をスクリプト化できます。ファイルへのデータの書き込みが失敗した場合など、特定の時点で、スクリプトでトランザクションを明示的にコミットまたは終了することもできます。
スクリプトのコミットまたは終了 Transaction Server はトランザクション処理を追跡するため、トランザクションが完全に成功したか失敗したかを判断します。スクリプトは、ObjectContext.SetAbort を呼び出すことでトランザクションを明示的に終了できます。 たとえば、コンポーネントからエラー メッセージを受信した場合、ビジネス仕様に違反した場合 (アカウント残高が 0 未満など)、またはファイルの読み取りや書き込みなどの非トランザクション操作が失敗した場合、スクリプトはトランザクションを終了する必要があります。トランザクションが完了する前にページがタイムアウトした場合、トランザクションも終了する必要があります。
トランザクション イベント スクリプトを作成するだけでは、トランザクションが成功するか失敗するかが決まりません。ただし、トランザクションがコミットまたは終了したときに呼び出されるイベントを作成できます。たとえば、銀行口座を確認するスクリプトがあり、トランザクションのさまざまな状態に応じてさまざまなページをユーザーに返す必要がある場合、OnTransactionCommit イベントと OnTransactionAbort イベントを使用して、ユーザーにさまざまな応答を書き込むことができます。
<%@ トランザクション = 必須 %>
<%
' 異なるページを表示できるように出力をバッファーします。
応答.バッファ = True
%>
<HTML>
<本体>
<H1>オンライン バンキング サービスへようこそ</H1>
<%
Set BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(Request("AcctNum"))
%>
<P>ありがとうございます。取引は処理中です。</P>
</BODY>
</HTML>
<%
' トランザクションが成功すると、このページが表示されます。
SubOnTransactionCommit()
応答。「<HTML>」を書き込みます
応答。「<BODY>」と書き込みます。
応答。「ありがとうございます。アカウントに入金されました。」と書きます。
応答。「</BODY>」と書き込みます。
応答。「</HTML>」を書き込みます。
Response.Flush()
エンドサブ
%>
<%
' トランザクションが失敗した場合にこのページを表示します。
SubOnTransactionAbort()
Response.Clear()
応答。「<HTML>」を書き込みます
応答。「<BODY>」と書き込みます。
応答。「取引を完了できません。」と書きます。
応答。「</BODY>」と書き込みます。
応答。「</HTML>」を書き込みます。
Response.Flush()
エンドサブ
%>
MTS リソース マネージャーへのコンポーネントの登録 トランザクションに参加するには、コンポーネントを MTS パッケージに登録し、トランザクションを要求するように構成する必要があります。たとえば、スクリプトが 2 つのコンポーネントを呼び出して注文を処理する場合、1 つは在庫データベースを更新し、もう 1 つは支払いデータベースを更新します。次に、これら 2 つのコンポーネントは同じトランザクション環境で実行する必要があります。 Transaction Server は、コンポーネントに障害が発生した場合、データベースが更新されないことを保証します。 Ad Rotator コンポーネントなど、一部のコンポーネントはトランザクションを必要としません。
MTS Resource Manager を使用してトランザクション コンポーネントを登録および構成します。トランザクションのプロパティは、「トランザクションが必要」または「新しいトランザクションが必要」に設定する必要があります。トランザクション コンポーネントは MTS パッケージに登録する必要があります。コンポーネントを IIS インプロセス パッケージに配置するのではなく、独自のパッケージを作成します。通常、すべてのコンポーネントはコンポーネント ライブラリに配置する必要があります。コンポーネント ライブラリのコンポーネントは、複数の ASP アプリケーションで使用でき、ASP アプリケーション プロセスで実行できます。 MTS エクスプローラーを使用して新しいパッケージを作成し、パッケージの Activation プロパティを Library に設定します。
トランザクション コンポーネントは、サーバー パッケージに登録することもできます。サーバー パッケージは通常、サーバー上で別のプロセスとして実行されます。機能グループベースのセキュリティチェックを使用する場合、またはリモートコンピュータ上のアプリケーションからコンポーネントにアクセスできるようにする場合は、トランザクションコンポーネント用の Server パッケージを使用します。
MTS Explorer を使用するには、Microsoft Transaction Server がインストールされている必要があります。
オブジェクトのスコープ 一般に、MTS コンポーネントから作成されたオブジェクトを ASP アプリケーションまたはセッション オブジェクトに保存しないでください。 MTS オブジェクトはトランザクションが完了すると消えます。 Session オブジェクトと Application オブジェクトは、異なる ASP ページ間で使用されるオブジェクト インスタンス用に設計されているため、トランザクションの終了時に解放されるオブジェクトの格納には使用しないでください。
ASP スクリプトは、宣言されたトランザクションのルート、つまり開始点です。トランザクション ASP ページで使用される MTS オブジェクトは、トランザクションの一部とみなされます。トランザクションが完了すると、セッション オブジェクトまたはアプリケーション オブジェクトに保存されているオブジェクトを含め、ページで使用されている MTS オブジェクトが消えます。この時点以降、別のトランザクション ページからセッション スコープまたはアプリケーション スコープのオブジェクトを呼び出そうとしても失敗します。
トランザクション キューイング リモート サーバーからデータベースを更新すると、ネットワークの遅延や障害が原因でトランザクションが遅延したり、終了したりする可能性があります。トランザクションのすべての部分をコミットする必要があるため、リモート サーバーからのコミットまたは中止メッセージを待ってアプリケーションがハングしたり、データベース更新を送信できないためにトランザクションが中止されたりする可能性があります。
同時に完了する必要がある更新の場合、正しいアプローチは、トランザクションを終了するか、トランザクションの参加者全員がコミットできるまでトランザクションの完了を遅らせることです。たとえば、航空会社の予約プロセスでは、顧客の銀行口座からの引き落としと航空会社の銀行口座への入金を同時に行う必要があります。更新がトランザクション全体の一部であるものの、他の更新よりも遅れる可能性がある場合は、更新プロセス全体が完了するまで顧客を待たせたくない場合があります。たとえば、航空券の予約トランザクションでは、食品の注文を食品サプライヤーに送信したり、顧客の出張手当を更新したりすることもあります。これらの操作は完了する必要がありますが、後で実行することもできます。
Microsoft Message Queue Server を使用すると、1 つまたは複数の更新をリモート サーバーへのトランザクション メッセージにバンドルできます。 Message Queue サーバーは、ネットワークが現在利用できない場合でも、更新がリモート サーバーに送信されることを保証します。アプリはコミット メッセージを受信し、トランザクションの処理を続行できます。