Web アプリケーションを開発するときは、データのクエリ、挿入、更新、削除などの操作を完了するために常にデータベースにアクセスする必要があります。アプリケーション ロジックの影響を受け、複数のデータベース操作命令を 1 つの作業単位 (トランザクション) に結合することが必要になる場合があります。データベースでは、トランザクションとは、データをある状態から別の状態に変換する論理演算単位のセットを指します。データベース内のデータの一貫性を確保するには、データを論理ユニットの個別のグループで操作する必要があります。すべてが完了すると、データの一貫性は維持されますが、ユニット内の操作の一部が失敗すると、全体が維持されなくなります。トランザクションは無視され、開始点以降のすべての操作は開始状態に戻ります。
実際、データベース上のすべての操作はデフォルトで暗黙的にトランザクション処理されます。この記事では、一般的なユーザー登録プログラムを例として、ASP を使用してトランザクション処理を実装する 3 つの方法を紹介します。ASP データベース コンポーネントに基づくソリューション、データベース内のトランザクション処理メカニズムに基づくソリューション、および MTS コンポーネントに基づくソリューションです。 。
プログラム機能
SQL Server データベースに USER テーブルと USERDOC テーブルの 2 つのテーブルを作成します。 USER テーブルには、登録ユーザーのユーザー名とパスワードが格納され、USERDOC テーブルには、ユーザー名によってインデックス付けされた登録ユーザーの個人情報が格納されます。 USER テーブルと USERDOC テーブルの定義は次のとおりです。
テーブル USER(userName varchar(30),userPasswd varchar(30)) の作成
Create Table USERDOC(userName varchar(30),Age int,Sex int,PhoneNumber varchar(20),Address varchar(50))
ユーザーが登録を要求すると、ASP スクリプトはまずユーザー名とパスワードを USER テーブルに挿入し、次にUSERDOC 内 ユーザーの個人情報 (年齢、性別、連絡先番号、自宅住所など) をテーブルに挿入します。同時に、アプリケーションは、USER テーブル内の各レコードが USERDOC テーブル内の対応するレコードを持つことを確認する必要もあります。
方法 1 では、ASP 組み込み ADO コンポーネントの Connection オブジェクトを使用して、データベース操作のトランザクション処理を実装します。 Connection オブジェクトのいくつかのメソッドは次のとおりです。
●Connection.BeginTrans メソッド: トランザクションを開始します。
●Connection.CommitTrans メソッド: トランザクションを完了/送信します。
●Connection.RollBackTrans メソッド: トランザクションを取り消し/破棄します。
//トランザクション操作を開始します
<%Conn.BeginTrans%>
<% sqlText="USER(userName,userPasswd) 値に挿入('" %>
<% sqlText=sqlText & request("usrName") & "','"&request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then %>
<% conn.Errors.Clear %>
//データ挿入操作が失敗した場合、トランザクションはロールバックされます。
<% conn.RollBackTrans %>
<%response.Redirect RegisterFail.html %>
<% % の場合は終了>
<% sqlText="USERDOC(ユーザー名,年齢,性別,電話番号,住所)に挿入 "%>
<% sqlText=sqlText & "values('"& request ("usrName") & "', " & request("Age") %>
<% sqlText=sqlText & ",'" & request ("PhoneNum") & "','" %>
<% sqlText=sqlText & request("アドレス") & "') " %>
//トランザクション単位で2番目のinsert文を実行する
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then %>
<% conn.Errors.Clear %>
// 操作が失敗した場合、トランザクションはロールバックされます。
<% conn.RollBackTrans %>
<%response.Redirect RegisterFail.html %>
<% % の場合は終了>
//トランザクション操作全体が正しく実行された場合、トランザクションをコミットします
<% Conn.CommitTrans %>
//登録成功処理ページへ移動
<%response.Redirect RegisterOk.html %>
方法 2 では、データベース システム内のトランザクション処理メカニズムを使用して、データベース サーバーにトランザクションを含むストアド プロシージャを作成することで、データ操作のトランザクション処理を完了できます。同時に、ADO コンポーネントを使用してストアド プロシージャを呼び出すことにより、ストアド プロシージャの戻りコードに基づいてトランザクションが正常に実行されたかどうかを判断することもできます。
データベース システムでは、各 SQL ステートメントがトランザクションです。したがって、各ステートメントが完了するか、最初に戻ることが保証されます。ただし、一連の SQL ステートメントの操作をすべて完了するかすべて無効にする場合は、データベースのトランザクション処理メカニズムを使用してこれを実現する必要があります。
データベースにストアド プロシージャを生成する主なコードは次のとおりです。
開始としてプロシージャ RegisterUser (@usrName varchar(30), @usrPasswd varchar(30),@age int, @PhoneNum varchar(20), @Address varchar(50) ) を作成します。
//定義を表示してトランザクションを開始する
トランスを開始します
USER(userName,userPasswd) の値に挿入(@usrName,@usrPasswd)
if @@error<>0
始める
// 操作が失敗した場合、トランザクションはロールバックされます
ロールバックトラン
//ストアド プロシージャに戻り、リターン コードをトランザクション操作の失敗に設定します。
-1 を返す
終わり
USERDOC(ユーザー名,年齢,性別,電話番号,住所)に挿入
値(@ユーザー名、@年齢、@電話番号、@アドレス)
if @@error<>0
始める
// 操作が失敗した場合、トランザクションはロールバックされます
ロールバックトラン
-1 を返す
終わり
// 操作が正しく実行された場合、トランザクションをコミットします
コミットトランス
0を返す
終わり
ASP スクリプトでデータベース ストアド プロシージャを呼び出すための主なコードは次のとおりです。
<% Set Comm=server.CreateObject
("ADODB.コマンド") %>
<% Comm.ActiveConnection=conn を設定 %>
<% Comm.CommandType=adCmdStoredProc %>
<% Comm.CommandText="RegisterUser" %>
//パラメータオブジェクトを返すストアドプロシージャを作成
<% Set RetCode=Comm.CreateParameter
("RetCode",adInteger,adParamReturnValue) %>
//ストアドプロシージャ入力パラメータオブジェクトを作成
<% Set usrName=Comm.CreateParameter ("usrName",adVarchar,adParamInput,30) %>
<% Set usrPwd=Comm.CreateParameter
("usrPasswd",adVarchar,adParamInput,30) %>
<% Set age=Comm.CreateParameter("age",adInteger,adParamInput) %>
<% Set PhoneNum=Comm.CreateParameter
("PhoneNum",adVarchar,adParamInput, 20) %>
<% Set Address=Comm.CreateParameter("Address",adVarchar,adParamInput,50) %>
<% Comm.Parameters.Append usrName %>
<% Comm.Parameters.Append usrPwd %>
<% Comm.Parameters.Append age %>
<% Comm.Parameters.Append PhoneNum %>
<% 通信パラメータ.追加アドレス %>
<% Comm.Parameters("usrName")=request("usrName") %>
<% Comm.Parameters("usrPasswd")=request("usrPasswd") %>
<% Comm.Parameters("年齢")=リクエスト("年齢") %>
<% Comm.Parameters("PhoneNum")=request("PhoneNum") %>
<% Comm.Parameters("アドレス")=リクエスト("アドレス") %>
<% 通信実行 %>
<% RetValue=Cint(Comm("RetCode")) %>
//データベースストアドプロシージャの戻りコードに基づいて登録が成功したかどうかを判断します
<% if RetValue< 0 then %>
<% response.Redirect RegisterFail.html %>
<% 他 %>
<%response.Redirect RegisterOk.html %>
<% % の場合は終了>
方法 3: MTS (Microsoft Transaction Server) コンポーネントのトランザクション処理メカニズムを使用してトランザクション処理を実装する場合、トランザクションが複数のコンポーネントからのオブジェクトを必要とする場合、このメカニズムに基づくトランザクションは複数の ASP ページにまたがることができないという事実に特別な注意を払う必要があります。 , これらのオブジェクトに対する操作を ASP ページで組み合わせる必要があります。
まず、ページの先頭に @TRANSACTION ディレクティブを追加して、ASP ページをトランザクションとして宣言する必要があります。
@TRANSACTION ディレクティブはページの最初の行になければなりません。そうしないとエラーが生成されます。ページ内の ASP スクリプト処理が終了すると、現在のトランザクションが終了します。
<%@ TRANSACTION=必要な言語=
VBScript%>
//トランザクションの実行によりイベントが正常にトリガーされました
<% サブ OnTransactionCommit() %>
<%response.Redirect RegisterOk.html %>
<% エンドサブ %>
// 実行に失敗したときにトリガーされるイベント
<% サブ OnTransactionAbort() %>
<% response.Redirect RegisterFail.html %>
<% エンドサブ %>
<% sqlText="USER(userName,userPasswd) 値に挿入('" %>
<% sqlText=sqlText & request("usrName") & "','" &request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then %>
<% conn.Errors.Clear %>
<% ObjectContext.SetAbort %>
<% % の場合は終了>
<% sqlText="USERDOC(ユーザー名,年齢,性別,電話番号,住所)に挿入 "%>
<% sqlText=sqlText & "values('" & request("usrName")& "', " & request("Age") %>
<% sqlText=sqlText & ",'" & request("PhoneNum") & "','" %>
<% sqlText=sqlText & request("アドレス") & "') " %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then %>
<% conn.Errors.Clear %>
<% ObjectContext.SetAbort %>
<% % の場合は終了>
<% ObjectContext.SetComplete %>
ASP データベース コンポーネントを使用する方法には、より柔軟な利点があります。ADO データベース コンポーネントを使用してトランザクション処理を完了できるほか、(ASP コンポーネントを満たす限り) 実際のニーズに応じて独自のデータベース コンポーネントをカスタマイズすることもできます。仕様書を書く)ことができます)。データベースのトランザクション処理の信頼性を考慮すると、データベース内のトランザクション処理ストアドプロシージャを使用する方が良いでしょう。このように、データベース トランザクション メカニズムを直接使用して、アプリケーションの論理トランザクション処理を完了することができ、安全かつ信頼性が高く、Web サーバーとデータベース サーバー間のデータ対話が軽減されます。これは、分散データベース システムにとって特に重要です。 MTS コンポーネントを使用したトランザクション処理方式の利点は、コンポーネント (MTS に登録されているコンポーネント) の操作の完了と取り消しを MTS サーバーが直接制御および管理することです。拡張スペースとアプリケーションの見通しが良く、技術的な効果を最大限に発揮できます。 MTS の利点は、ネットワーク アプリケーションのフォールト トレランス パフォーマンスを強化し、IIS Web サーバーの動的パフォーマンスを向上させることです。