ObjectContext オブジェクトは、ASP ページ内のスクリプトによって開始された、コンポーネント サービスが管理するトランザクションをコミットまたは中止します。
ASP に @TRANSACTION ディレクティブが含まれている場合、そのページは 1 つのトランザクション内で実行され、トランザクションが完全に終了するかまたは失敗するまで、ページの処理は完了しません。
ObjectContext.method
SetAbort | SetAbort メソッドは、スクリプトで開始されたトランザクションが完了していないので、リソースを更新すべきではないことを宣言します。 |
SetComplete | SetComplete メソッドは、トランザクションを完了させないための理由が、そのスクリプトでは見つからないことを宣言します。トランザクションに参加しているすべてのコンポーネントが SetComplete を呼び出すと、トランザクションは完了します。 |
OnTransactionAbort |
OnTransactionCommit |
ObjectContext は、COM の ObjectContext オブジェクトのメソッドのうち、2 つのメソッドを実装しています。SetAbort メソッドは、トランザクションを明示的に中止します。この場合、コンポーネント サービスは、トランザクションの第 1 フェーズに関与したリソースに対する更新が行われないようにします。トランザクションが中止されると、そのスクリプトの OnTransactionAbort イベントが処理されます。
SetComplete メソッドの呼び出しは、必ずしもトランザクションの完了を意味するものではありません。トランザクションが完了するのは、スクリプトから呼び出されたトラザクション コンポーネントのすべてが SetComplete を呼び出した後です。ほとんどの場合、スクリプトの中で SetComplete を呼び出す必要はありません。これは、SetAbort を呼び出すことなく処理が終了したスクリプトは正常に完了したと見なされるためです。
ObjectContext は、SetAbort と SetComplete 以外のメソッドも公開しています。ただし、これらのメソッドは ASP スクリプトでは利用できません。スクリプトから呼び出されたコンポーネントでは、これらのメソッドを利用できます。
次に示すのは、SetAbort メソッドと SetCommit メソッドの例です。Sales.htm ファイルは、注文の処理に必要なデータを取得します。もう 1 つのファイル SalesVerify.asp にはスクリプトが記述されており、Inventory および Sales という 2 つのオブジェクトを使用して注文の要求を処理します。在庫が十分になく、要求を処理できないことを示すエラー コードが Inventory から返された場合は、SetAbort を呼び出します。Inventory オブジェクトがエラー コードを返さなければ、SetComplete を呼び出し、注文を処理します。
Sales.htm
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<TITLE>Sales Order</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF"><FONT FACE="ARIAL,HELVETICA">
<H2>Sales Order Form </H2>
<FORM METHOD=POST ACTION="SalesVerify.asp">
<P>Please enter the product code, quantity, and your account number.
<INPUT TYPE=TEXT NAME=QuantityToBuy>
<INPUT TYPE=TEXT NAME=ProductCode>
<INPUT TYPE=TEXT NAME=AccountIn>
<P>
<INPUT TYPE=SUBMIT>
</FONT>
</BODY>
</HTML>
SalesVerify.asp ファイル
<%@ Transaction = Required %>
<%
Set CurrentQOH = Server.CreateObject("Mycomp.Inventory")
Set CurrentSales = Server.CreateObject("Mycomp.Sales")
CheckQuantity = Request("QuantityToBuy")
CheckProduct = Request("ProductCode")
QuantityStatus = CurrentQOH.CheckQOH(CheckQuantity,CheckProduct)
If QuantityStatus = None
ObjectContext.SetAbort
Response.Write "Sorry, there is not sufficient quantity on hand to
process your sale."
Else
ObjectContext.SetComplete
Account = Request("AccountIn")
Saleupdate = CurrentSales.PostIt(AccountIn)
End If
%>
詳細については、「トランザクションを理解する」を参照してください。