日期:2012-03-02  浏览次数:20857 次


     我们已经了解事务,并知道如何由ASP进行操纵,下面举个例子。本节将以定义一个商业要求及其相关的需求开始,然后通过使用ASP和COM+的事务来设计和实现。
19.5.1 业务需要
    在这个例子中,业务需要是订单处理系统的前端部分。订单处理系统要生成订单,同时也要调整库存数量。每次接受订单,都要正确地调整库存数量,这一点非常重要。
    由于这个例子由两个任务组成(产生订单和调整库存数量),将这些任务放在一个单独的事务中是必要的。这样就能利用COM+的功能。COM+能为该事务提供所有的主要工作,我们所要做的仅仅是告诉COM+提交或终止事务。
19.5.2 设计
    这个例子能分解为典型的三层结构,而且也适合Microsoft的DNA结构。在高层,这个例子是一个ASP用户界面(UI),在这里查看在SQL Server 7.0数据库中的各种产品。但是, ASP代码不与数据库交互,它利用COM组件从未连接的记录集窗体中检索数据。
    通过ASP用户界面检索订单,该ASP用户界面调用一个事务性COM组件,这个COM组件把订单插入到数据库中,同时也调整库存数量。
    1. 数据服务
    如上所述,数据库将驻留于SQL Server 7.0中。选择SQL Server的原因是它支持COM+( DTC)事务。如果需要的话,也可以使用SQL Server 6.5。
    在这个例子中有两个表,一个是产品表,另一个是订单表。为了简单起见,在称为ASP Transactions的数据库中使用的表名分别是Orders和Products,表的结构分别如图1 9 - 1 4和图1 9 -1 5所示。

    应该在Products表中加入一些样本数据,以便能返回到ASP页中。
    大多数应用程序建立在更复杂的数据库设计上,其数据库含有存储过程、触发器和调度的任务等。然而,作为一个示例,上述表已经足够充分了。

    我们已经在本书可下载的源代码中提供了脚本,这些脚本可以创建这些数据表,并把一些数据插入到Products数据表中。
    2. 业务逻辑
    这个例子的业务逻辑将封装在一个由VB建立的ActiveX DLL中。该DLL含有两个类:一个类能给调用者提供检索可用产品列表的能力,另一个类提交订单。检索产品列表的类是非事务性的,而更新列表的类是事务性的,以确保同时改变两个表。
19.5.3 实现
    现在打开VB并创建新的ActiveX DLL项目。在VB中,设置项目的名字为ASP Trans,缺省类的名字设置为Order。增加一个类模型,称为Products。
    如果希望能在Order类中设置MTS TransactionMode为2-Requires Transaction。当Order类被放入COM+时,它将自动地把组件的Transaction Support 属性设置为Required。记住,只有从Add File对话框把组件加入到一个COM+应用程序时,这种缺省设置才会生效。
    在类中加入代码之前,必须首先设置正确的引用,在References对话框中,设置的引用为Microsoft ActiveX Data Objects 2.5 Library和COM+ Services Type Library,如图1 9 - 1 6所示。

    现在可以把代码加到这些类中了。
    1. 产品组件
    首先在Products类中增加一个名为GetProducts的函数。GetProducts方法没有参数,并返回一个未连接的ADO记录集。

    接着,添加所有错误处理、提交或终止事务的代码。要注意的是这个函数仅返回数据,不更新任何资源。然而,我们仍想使用环境来通知COM+收回这些资源:


    新增加的代码完成了GetProducts函数,它对Products数据表执行一个普通的SELECT语句。
    注意客户端指针的使用与服务器端指针完全不同。当使用未连接的记录集工作时,必须使用客户端指针;它通知ADO立刻获取所有的数据,而不是一次读取一点数据。一旦检索到数据,代码断开记录集,并把值返回给调用者。
    2. 订单组件
    接着,建立处理用户订单的方法。这个方法命名为PlaceOrder,是一个普通的子程序,要求有四个描述订单的参数。PlaceOrder不是一个函数,也不返回值。

    PlaceOrder要求的四个参数是使用者姓和名、产品的I D和数量。PlaceOrder程序将完成两个主要的事情:在Order数据表中增加一条记录和为产品调整库存数量。
    下面增加错误处理和事务支持代码。像其他的方法一样,如果出现错误,将转入Error_Handler部分,并回滚事务