📄 page13.htm
字号:
处理事务的一致性。事务处理只适用于数据库访问;MTS
不能对文件系统或其他的非事务性资源的更改进行恢复操作。应用程序所访问的数据库必须为
MTS 所支持。目前,MTS 支持 SQL Server 及任何支持 XA 协议(由 X/Open
协会制定)的服务器。MTS 将继续扩展对其他数据库的支持。</p>
<p>事务不能跨越多个 ASP
页。如果一个事务需要来自多个组件的对象,则须将使用这些对象的操作组合在一个
ASP
页中。例如,假定有一个组件用于更新工资单数据库,还有一个组件用于更新人力资源数据库中的员工记录。为了记录一个员工的新的工资信息,您需要编写这样一个脚本,该脚本在一个事务环境中调用这两个组件,一个用于更新工资单数据库,另一个用于更新人力资源数据库中的员工等级。</p>
<p><strong>声明事务性脚本</strong></p>
<p>在将一个页声明为事务性时,此页中的任何脚本命令和对象都运行在同一个事务环境中。Transaction
Server
处理生成事务的细节并决定事务成功(提交)或失败(终止)。要将某个页声明为事务性,可在页首添加
@TRANSACTION 指令:</p>
<p><%@ TRANSACTION = value %></p>
<p>value 参数可以是下列之一:</p>
<p>值 意义 </p>
<p>Requires_New 启动一个新的事务。 </p>
<p>Required 启动一个新的事务。 </p>
<p>Supported 不启动事务。 </p>
<p>Not_Supported 不启动事务。 </p>
<p>@TRANSACTION
指令必须在一页中的第一行,否则将产生错误。必须将该指令添加到需要在事务下运行的每一页中。当脚本处理结束时,当前事务即告结束。</p>
<p>大多数应用程序只有一些特定的操作需要事务环境。例如,一个航空公司的站点可能只需要事务性脚本处理购票和安排座位,而其他所有脚本则无须事务环境即可安全运行。因为事务只须用于需要事务处理的页即可,不要将应用程序的
Global.asa 文件声明为事务性。</p>
<p>如果事务被终止,Transaction Server
将恢复对支持事务的资源的任何更改。目前,仅数据库服务器完全支持事务,因为数据库中的数据对于企业应用是最为关键的。Transaction
Server
不对硬盘上的文件、会话和应用程序的变量、集合等的改变进行恢复。然而您可以如下文主题所述,通过编写事务事件来编写恢复变量和集合的脚本。在某些时候,您的脚本也可以显式的提交或终止一个事务,如向文件写数据失败时。</p>
<p><strong>提交或终止脚本</strong></p>
<p>因为 Transaction Server
跟踪事务处理,所以它决定事务是完全成功还是失败。脚本可以通过调用
ObjectContext.SetAbort 显式地声明终止一个事务。
例如,当一个事务在从一个组件收到错误消息、违反商业规范时(例如,帐户余额小于
0)或读写文件等非事务性操作失败时,脚本就需要终止该事务。如果页在事务完成之前超时,也必须终止事务。</p>
<p><strong>编写事务事件</strong></p>
<p>脚本本身不能决定事务是成功还是失败。但是,可以编写提交或终止事务时被调用的事件。例如,假设有一个确认银行帐户的脚本,并且您需要针对事务的不同状态将不同的页返回给用户,那么就可以使用
OnTransactionCommit 和 OnTransactionAbort 事件来编写对用户的不同响应。</p>
<p><%@ TRANSACTION = Required %></p>
<p><%</p>
<p>'Buffer output so that different pages can be displayed.</p>
<p>Response.Buffer = True</p>
<p>%></p>
<p><HTML></p>
<p><BODY></p>
<p><H1>Welcome to the online banking service</H1></p>
<p> </p>
<p><%</p>
<p>Set BankAction = Server.CreateObject("MyExample.BankComponent")</p>
<p>BankAction.Deposit(Request("AcctNum"))</p>
<p>%></p>
<p><P>Thank you. Your transaction is being processed.</P></p>
<p></BODY></p>
<p></HTML></p>
<p><%</p>
<p>' Display this page if the transaction succeeds.</p>
<p>Sub OnTransactionCommit()</p>
<p>Response.Write "<HTML>"</p>
<p>Response.Write "<BODY>"</p>
<p>Response.Write "Thank you. Your account has been credited."</p>
<p>Response.Write "</BODY>"</p>
<p>Response.Write "</HTML>"</p>
<p>Response.Flush()</p>
<p>end sub</p>
<p>%></p>
<p><%</p>
<p>' Display this page if the transaction fails.</p>
<p>Sub OnTransactionAbort()</p>
<p>Response.Clear()</p>
<p>Response.Write "<HTML>"</p>
<p>Response.Write "<BODY>"</p>
<p>Response.Write "We are unable to complete your transaction."</p>
<p>Response.Write "</BODY>"</p>
<p>Response.Write "</HTML>"</p>
<p>Response.Flush()</p>
<p>End sub</p>
<p>%></p>
<p><strong>在 MTS 资源管理器中登记一个组件</strong></p>
<p>为了参与一个事务,组件必须在 MTS
包中登记,而且必须被配置为需要事务。例如,如果您的脚本是通过调用两个组件来处理订单的,一个更新库存数据库,另一个更新付款数据库。那么,这两个组件就要在同一个事务环境中运行。Transaction
Server
保证如果任意一个组件失败,那么将不会有数据库被更新。某些组件不需要事务;例如,Ad
Rotator 组件。</p>
<p>注册和配置事务性组件可使用 MTS
资源管理器。必须将事务的属性设置为需要事务或需要新事务。事务组件必须在
MTS 包中注册。不要将组件放在 IIS
内部进程包中,而应该创建自己的包。通常,应将所有的组件放在一个组件库中。组件库的组件可被多个
ASP 应用程序使用并以 ASP 应用程序进程运行。使用 MTS
资源管理器可创建新的包并将包的 Activation 属性设置为 Library。</p>
<p>也可以在 Server 包中注册事务性组件。Server
包通常以服务器上的一个独立的进程运行。如果希望使用基于职能组的安全性检查或希望您的组件可被远程计算机上的应用程序访问,可对事务性组件使用
Server 包。</p>
<p>要使用 MTS 资源管理器,必须安装 Microsoft Transaction Server。有关注册组件和选择包类型的详细信息,请参阅
创建 MTS 包。</p>
<p><strong>对象作用域</strong></p>
<p>一般情况下,不要将从 MTS 组件中创建的对象存储在 ASP Application
或 Session 对象中。 MTS 对象在事务完成后消失。因为 Session 对象和
Application 对象是为在不同 ASP
页之间使用的对象实例设计的,所以不要用它们保存在事务结束时即被释放的对象。</p>
<p>ASP 脚本是已声名的事务的根,即起始点。任何事务性 ASP
页所使用的 MTS
对象都被认为是事务的一部分。当事务完成后,在页中使用的 MTS
对象将消失,其中包括存储在 Session 或 Application
对象中的对象。在此之后,从另一个事务性页中调用会话作用域或应用程序作用域对象的尝试都将失败。</p>
<p><strong>事务排队</strong></p>
<p>从一个远程服务器对数据库的更新可能因为网络延迟或故障而导致事务延迟或终止。因为事务的所有部分都必须提交,所以应用程序将可能挂起,等待远程服务器的提交或终止消息,也可能由于无法发送数据库更新而导致事务被放弃。</p>
<p>对于必须同时完成的更新,正确的做法是在事务的所有参与者都能够提交之前,终止事务或推迟完成事务。例如,航空公司的定票程序应该同时完成对客户的银行帐号计入借方和对航空公司的银行帐户计入贷方。如果一个更新属于事务整体的一部分,但可能晚于其他更新,您可能不希望让客户等待整个更新过程的完成。例如,机票预定事务可能也要向食品供应商发送食品订单或更新客户的旅程津贴。这些操作虽然也必须完成,但可以晚一些。</p>
<p>Microsoft Message Queue Server
使您能够将一个或一组更新捆绑到一个事务性消息中送给远程服务器。Message
Queue Server
保证更新将被发送给远程服务器,即使目前网络不可用。您的应用将收到一个提交消息,从而可以继续处理事务。</p>
<p>有关在 ASP 应用程序中使用消息队列的示例,请参阅
开发人员范例。要查看这些示例,必须安装 SDK 文档。</p>
<p>有关 Microsoft Message Queue Server 的详细信息,请参阅 Microsoft Message
Queue Server。</p>
<p> </p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>模块 1:创建 ASP 页</strong></p>
<p>请选择本课的脚本语言</p>
<p>在本模块中,通过创建自己的 ASP 页(.asp 文件),您将学习一些
ASP 的基本知识。在这些课程中用到的示例文件,可以在 localhost Web
服务器的 Tutorial 目录 (C:\WINNT\Help\iis\htm\tutorial)
中找到。请将您创建的文件也保存到 Tutorial 目录中。</p>
<p>要点 要保存并查看您在本模块中的工作结果,必须在 localhost Web
服务器上对 /iishelp/iis/htm/tutorial 虚拟目录具有“写 (Write)”和“改编
Web 服务器 (Script Web server)”权限,当然必须已经安装了 Active Server
Pages。详细信息,请参阅 设置 Web 服务器权限。</font></p>
<layer src="http://www.spidersoft.com/ads/bwz468_60.htm" visibility=hidden id=a1 width=600 onload="moveToAbsolute(ad1.pageX,ad1.pageY); a1.clip.height=60;visibility='show';"></layer>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -