您的位置:首页 > php COM+事务和IIS
站内搜索

COM+事务和IIS

microsoft已经紧密地集成了iis和com+的功能,这使我们能非常容易地在事务性web页面编程中利用事务处理应用程序。有许多不同方式集成com+和iis的事务特性,这些例子包括:
? 事务性asp。
? asp 中的objectcontext。
? 事务性事件。
开发者可以在使用iis和com+的应用程序中使用一个或多个这些特性。因为它们是紧密集成的,开发者只进行少量的工作,就能充分利用这些服务。事实上,在com+ 中objectcontext封装了一个事务,可以直接用于事务中的asp页面。
19.4.1 事务性asp
由于iis 4.0和mts的集成,开发者可以在一个事务中包含asp脚本。这些asp网页可以包含对服务器组件的调用,这些组件也将参与相同的事务。同所有的事务一样,如果事务的任一部分失败,将回滚整个事务。事务性asp脚本所增加的优点就是使得把多个组件绑定到单个事务中变得简单化。
当处理一个终止的事务时,使用事务性脚本有一个问题。通过数据库的资源管理器访问数据库产生的改变将被自动地回滚,然而, com+不能回滚脚本自身产生的变化。例如,使用脚本产生的任何变化,如对session或application变量的改变,将不会自动地回滚。以后你将看到如何使用事务性事件通知事务已经终止。当处理这个事件时,能手工地回滚com+不能自动回滚的变化。这种限制的原因是com+事务只能回滚与ms dtc相容的服务产生的变化。
在iis 5.0中有一个新特性。开发者具有使得一个事务跨越多个asp脚本网页的能力。这归功于在server对象上新增的execute和transfer方法。
然而,正常情况下,单个事务的所有处理可以在单个asp网页中完成。例如,如果一个应用程序有一个组件从一个帐户中提款,而另一个组件在一个帐户中存款。为了把资金从一个帐户转到另一个帐户,创建asp脚本,利用提款组件从帐户中取出资金,使用存款组件把资金存入新的帐户。将所有这些功能放入一个事务性asp网页中,如果事务过程的任一部分失败,就回滚所有的变化,帐户余额回到其初始值。
为声明一个网页是事务性的,使用下列指令:
<%@ transaction=value %>
对transaction指令可能的设置有:
? disabled:告诉com+不希望在事务中涉及组件。
? requires_new:即使已存在一个事务,也启动一个新的事务。
? required:如果不存在事务就启动一个新的,如果存在就参与到其中。
? supported:不启动一个事务,但是如果事务已经存在就参与它。
? not_supported:即使存在事务,也不参与事务。
这些值与使用组件服务浏览器为每个组件设置的transaction support属性的作用相同。
transaction指令必须处在asp页面脚本的第一行,通常由language指令包含。如果这之前在页面中有任何内容,将产生脚本错误。如同组件中的事务一样,如果到达代码的最后一行,还没有提交或终止,则com+假定提交,并把变化写入磁盘。另外,由页面调用的每个对象能够使用同一asp页面的objectcontext对象参与事务,通常就是这么做的。
19.4.2 事务性asp中的objectcontext对象
当编写一个事务性asp脚本时,你可能想直接影响脚本的事务的结果。像为事务编写的组件一样,asp页也能利用objectcontext对象。自从发表了asp 2.0以后,就可以利用这个对象,它为开发者需要的所有事务处理例程提供功能。服务器组件参与事务时访问的就是这个对象,它包含setabort和setcomplete方法。
下列代码显示了在一个事务性web页中如何实例化两个com对象和一个事务,并在这两个对象上调用一个方法。
注意,页面顶部的事务设置表明请求一个事务。正是该设置使该页面像com组件一样参与同一事务。事实上,只要com组件的transaction support属性为required或supported,它们就变成由asp页启动的事务的一部分。

<%@ LANGUAGE=VBScript TRANSACTION=Required%>

<%

Dim objA
Dim objB

Set objA = Server.CreateObject("MyDll.MyClass")
Set objB = Server.CreateObject("MyDll2.MyClass2")

If Not objA.Go = 0 Then
 ObjectContext.SetAbort
ElseIf Not objB.Go = 0 Then
 ObjectContext.SetAbort
Else
 ObjectContext.SetComplete
End If
Set objA = Nothing
Set objB = Nothing

%>



随着asp页执行,调用每个com类的一个方法。当执行每个方法时,其返回值用于决定处理是否成功。如果任一方法返回一个非零值, asp页务。否则, asp页将提交事务并将变化存入磁盘。
这个例子的要点是所有的方法调用随着asp页面一调用objectcontext对象中的setabort方法,回滚事起进入到同一事务中。
上述的例子还可以改写,使得com组件中的方法从内部调用setcomplete和setabort方法。这将从asp页中删除一些逻辑,并嵌入到com组件中。用这种方式编写事务的唯一问题是asp页不知道将要提交还是终止事务。然而,这可以通过实现事务事件来解决。
19.4.3 事务事件
asp页也具有侦听com+的能力,可以了解事务何时将提交或终止。这是通过在com+提交或终止事务前iis调用两个例程来实现的。这两个方法称为o transaction commit和on transactionabort。
ontransactioncommit方法在com+提交事务之前、准备阶段之后被触发。只要事务中没有任何部分终止,将触发ontransactioncommit例程(事件),提交事务。如果事务被终止,则触发ontransactionabort事件:

<%@ LANGUAGE=VBScript TRANSACTION=Required%>

<%

Dim objA

Set objA = Server.CreateObject("MyDll.MyClass")
objA.Go
Set objA = Nothing

' Fires if the transaction commits
Sub OnTransactionCommit
 Response.Write ""
 Response.Write "The Transaction committed."
 Response.Write ""
End Sub

' Fires if the transaction aborts
Sub OnTransactionAbort
 Response.Write ""
 Response.Write "The Transaction aborted."
 Response.Write ""
End Sub
%>


同大多数事务性asp页一样,上述例子的开始外声明它要求一个事务,接下来脚本调用一个事务性com对象的方法。一旦完成该页, com+将通过检查是否有事务的某一部分调用了setabort方法来决定事务的结果。如果没有调用setabort方法,就触发ontransactioncommit事件,并且提交该事务;如果调用了setabort方法,则触发ontransactionabort事件,回滚事务。

 

  • 上一篇:用PHP编写PDF文档生成器
  • 下一篇:深入研究Asp.net页面的生命周期