帐户的脚本,并且您需要针对事务的不同状态将不同的页返回给用户,那么就可以使用 OnTransactionCommit 和 OnTransactionAbort 事件来编写对用户的不同响应。
<%@ TRANSACTION = Required %>
<%
'Buffer output so that different pages can be displayed.
Response.Buffer = True
%>
<HTML>
<BODY>
<H1>Welcome to the online banking service</H1>
<%
Set BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(Request("AcctNum"))
%>
<P>Thank you. Your transaction is being processed.</P>
</BODY>
</HTML>
<%
' Display this page if the transaction succeeds.
Sub OnTransactionCommit()
Response.Write "<HTML>"
Response.Write "<BODY>"
Response.Write "Thank you. Your account has been credited."
Response.Write "</BODY>"
Response.Write "</HTML>"
Response.Flush()
end sub
%>
<%
' Display this page if the transaction fails.
Sub OnTransactionAbort()
Response.Clear()
Response.Write "<HTML>"
Response.Write "<BODY>"
Response.Write "We are unable to complete your transaction."
Response.Write "</BODY>"
Response.Write "</HTML>"
Response.Flush()
End sub
%>
在 MTS 资源管理器中登记一个组件
为了参与一个事务,组件必须在 MTS 包中登记,而且必须被配置为需要事务。例如,如果您的脚本是通过调用两个组件来处理订单的,一个更新库存数据库,另一个更新付款数据库。那么,这两个组件就要在同一个事务环境中运行。Transaction Server 保证如果任意一个组件失败,那么将不会有数据库被更新。某些组件不需要事务;例如,Ad Rotator 组件。
注册和配置事务性组件可使用 MTS 资源管理器。必须将事务的属性设置为需要事务或需要新事务。事务组件必须在 MTS 包中注册。不要将组件放在 IIS 内部进程包中,而应该创建自己的包。通常,应将所有的组件放在一个组件库中。组件库的组件可被多个 ASP 应用程序使用并以 ASP 应用程序进程运行。使用 MTS 资源管理器可创建新的包并将包的 Activation 属性设置为 Library。
也可以在 Server 包中注册事务性组件。Server 包通常以服务器上的一个独立的进程运行。如果希望使用基于职能组的安全性检查或希望您的组件可被远程计算机上的应用程序访问,可对事务性组件使用 Server 包。
要使用 MTS 资源管理器,必须安装 Microsoft Transaction Server。有关注册组件和选择包类型的详细信息,请参阅 创建 MTS 包。
对象作用域
一般情况下,不要将从 MTS 组件中创建的对象存储在 ASP Application 或 Session 对象中。 MTS 对象在事务完成后消失。因为 Session 对象和 Application 对象是为在不同 ASP 页之间使用的对象实例设计的,所以不要用它们保存在事务结束时即被释放的对象。
ASP 脚本是已声名的事务的根,即起始点。任何事务性 ASP 页所使用的 MTS 对象都被认为是事务的一部分。当事务完成后,在页中使用的 MTS 对象将消失,其中包括存储在 Session 或 Application 对象中的对象。在此之后,从另一个事务性页中调用会话作用域或应用程序作用域对象的尝试都将失败。
事务排队
从一个远程服务器对数据库的更新可能因为网络延迟或故障而导致事务延迟或终止。因为事务的所有部分都必须提交,所以应用程序将可能挂起,等待远程服务器的提交或终止消息,也可能由于无法发送数据库更新而导致事务被放弃。
对于必须同时完成的更新,正确的做法是在事务的所有参与者都能够提交之前,终止事务或推迟完成事务。例如,航空公司的定票程序应该同时完成对客户的银行帐号计入借方和对航空公司的银行帐户计入贷方。如果一个更新属于事务整体的一部分,但可能晚于其他更新,您可能不希望让客户等待整个更新过程的完成。例如,机票预定事务可能也要向食品供应商发送食品订单或更新客户的旅程津贴。这些操作虽然也必须完成,但可以晚一些。
Microsoft Message Queue Server 使您能够将一个或一组更新捆绑到一个事务性消息中送给远程服务器。Message Queue Server 保证更新将被发送给远程服务器,即使目前网络不可用。您的应用将收到一个提交消息,从而可以继续处理事务。
有关在 ASP 应用程序中使用消息队列的示例,请参阅 开发人员范例。要查看这些示例,必须安装 SD
<%@ TRANSACTION = Required %>
<%
'Buffer output so that different pages can be displayed.
Response.Buffer = True
%>
<HTML>
<BODY>
<H1>Welcome to the online banking service</H1>
<%
Set BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(Request("AcctNum"))
%>
<P>Thank you. Your transaction is being processed.</P>
</BODY>
</HTML>
<%
' Display this page if the transaction succeeds.
Sub OnTransactionCommit()
Response.Write "<HTML>"
Response.Write "<BODY>"
Response.Write "Thank you. Your account has been credited."
Response.Write "</BODY>"
Response.Write "</HTML>"
Response.Flush()
end sub
%>
<%
' Display this page if the transaction fails.
Sub OnTransactionAbort()
Response.Clear()
Response.Write "<HTML>"
Response.Write "<BODY>"
Response.Write "We are unable to complete your transaction."
Response.Write "</BODY>"
Response.Write "</HTML>"
Response.Flush()
End sub
%>
在 MTS 资源管理器中登记一个组件
为了参与一个事务,组件必须在 MTS 包中登记,而且必须被配置为需要事务。例如,如果您的脚本是通过调用两个组件来处理订单的,一个更新库存数据库,另一个更新付款数据库。那么,这两个组件就要在同一个事务环境中运行。Transaction Server 保证如果任意一个组件失败,那么将不会有数据库被更新。某些组件不需要事务;例如,Ad Rotator 组件。
注册和配置事务性组件可使用 MTS 资源管理器。必须将事务的属性设置为需要事务或需要新事务。事务组件必须在 MTS 包中注册。不要将组件放在 IIS 内部进程包中,而应该创建自己的包。通常,应将所有的组件放在一个组件库中。组件库的组件可被多个 ASP 应用程序使用并以 ASP 应用程序进程运行。使用 MTS 资源管理器可创建新的包并将包的 Activation 属性设置为 Library。
也可以在 Server 包中注册事务性组件。Server 包通常以服务器上的一个独立的进程运行。如果希望使用基于职能组的安全性检查或希望您的组件可被远程计算机上的应用程序访问,可对事务性组件使用 Server 包。
要使用 MTS 资源管理器,必须安装 Microsoft Transaction Server。有关注册组件和选择包类型的详细信息,请参阅 创建 MTS 包。
对象作用域
一般情况下,不要将从 MTS 组件中创建的对象存储在 ASP Application 或 Session 对象中。 MTS 对象在事务完成后消失。因为 Session 对象和 Application 对象是为在不同 ASP 页之间使用的对象实例设计的,所以不要用它们保存在事务结束时即被释放的对象。
ASP 脚本是已声名的事务的根,即起始点。任何事务性 ASP 页所使用的 MTS 对象都被认为是事务的一部分。当事务完成后,在页中使用的 MTS 对象将消失,其中包括存储在 Session 或 Application 对象中的对象。在此之后,从另一个事务性页中调用会话作用域或应用程序作用域对象的尝试都将失败。
事务排队
从一个远程服务器对数据库的更新可能因为网络延迟或故障而导致事务延迟或终止。因为事务的所有部分都必须提交,所以应用程序将可能挂起,等待远程服务器的提交或终止消息,也可能由于无法发送数据库更新而导致事务被放弃。
对于必须同时完成的更新,正确的做法是在事务的所有参与者都能够提交之前,终止事务或推迟完成事务。例如,航空公司的定票程序应该同时完成对客户的银行帐号计入借方和对航空公司的银行帐户计入贷方。如果一个更新属于事务整体的一部分,但可能晚于其他更新,您可能不希望让客户等待整个更新过程的完成。例如,机票预定事务可能也要向食品供应商发送食品订单或更新客户的旅程津贴。这些操作虽然也必须完成,但可以晚一些。
Microsoft Message Queue Server 使您能够将一个或一组更新捆绑到一个事务性消息中送给远程服务器。Message Queue Server 保证更新将被发送给远程服务器,即使目前网络不可用。您的应用将收到一个提交消息,从而可以继续处理事务。
有关在 ASP 应用程序中使用消息队列的示例,请参阅 开发人员范例。要查看这些示例,必须安装 SD
| 对此文章发表了评论 |
