** 用 ** ** Microsoft.net ** ** 实现数据库事务 ** ** **
_ _
摘要:了解 .net 的 Pet Shop 2 企业版本是怎样帮助企业解决实际中的业务问题, Net Pet Shop
验证了怎样利用 .net 框架和 Visual Studio.net 来开发最佳的企业级系统。就如 Sun 公司的 Java™ Pet Store J2EE™ Blueprint application ,它也是一个最佳的系统实现。
介绍
.NET 宠物店程序开发于 2001 年 11 月,它描述了 .Net 开发者怎样利用 .net 框架和 Visual Studio.net 开发最佳的系统。下面关于宠物店和原来的 J2EE 宠物店的讨论涉及了企业级系统的一些特性,如可靠性和伸缩性。对于一个系统要部署成企业级,一定要考虑它的安全性、可靠性、可伸缩性、可管理性以及与已有的系统和数据进行协同的工作。以前版本的宠物店系统所表现出来的成本优势、性能和开发效率在 .Net 平台上仍然存在。本文通过描述了 .Net 支持的其他的企业级需求,从而把宠物店的讨论引向深入。
许多企业都有他们存在于不同系统中的分布的数据,比如存货数据在一个存货控制系统中,而客户资料数据却在他们的 CRM 系统中。我们的系统需要处理这些不同数据库中的数据,并且保证数据的更改在这些系统中正确进行,要达到这些要求,我们需要跨数据库的事务处理。
宠物店企业级版本是为了展示 .net 平台上的技术可以很好的支持那些企业级系统的特性。它在处理现实世界中存在的数据存储方面提供了一个可靠的、可伸缩的系统。宠物店企业级版本处理这样的一些情形,如客户数据存在于一个服务器上的客户数据库系统中,而客户定单数据存在于物理上不同的服务器上的一个不同的数据库系统中,这样的情形在许多机构中是一个普遍的现象。
为了保证客户数据和客户定单数据永远是正确的,需要一个包含这两个数据源的分布式系统。本文讨论了在 .net 企业级系统中处理事务的不同机制,给出了每种机制的示例代码,讨论了一些最佳做法。本文中的代码是用 c# 写成的,但所有的方法和技术一样适用于 VB.net.
本文所讨论的跨多个数据库的分布式事务对于一个系统来说早已被证实具有优良的性能和伸缩性。这里还测试了 .net 平台上的几种事务机制的性能,详细的列举和描述了它们的结果。从这些结果中,我们可以清楚的看到 .net 从功能上和性能上都提供了优秀的企业级事务支持。
本文还包含了宠物店的一些介绍,它的初始架构和实现,以及为了支持企业级特性对它的一些改动。还详细讨论了不同的事务方式和他们的测试性能结果图。
请参阅 how Sun Microsystems' Java Pet Store J2EE BluePrint Application was implemented using Microsoft .NET .
假设的情景
假设一个可以在线订购宠物的电子商务企业,当你进入系统后,你可以浏览、查询从犬类到爬行动物的各种类型的宠物。
一个典型的宠物店系统包括:
l ** 主页 ** ** ** - 当你打开系统后载入的页面。
l ** 类别浏览 ** – 顶层有五种类别,每种类别下面都有若干产品。
l ** 产品 ** – 当系统里面的一个产品被选种时,产品的属性就被显示出来,典型的如公或者母。
l ** 产品明细 ** – 每种产品属性的详细说明,如照片、价格和库存数量。
l ** 购物车 ** – 允许客户去维护一个购物车(增加、删除、更新数量)。
l ** 校验 ** – 只读地显示一个购物车信息。
l ** 登录定向 ** – 当用户在校验页面上选择继续的时候,如果他还没有登录,则会定向到登录页面。
l ** 验证登录 ** – 当登录被验证后,就会转到信用卡信息和订购地址信息页面。
l ** 确认定单 ** – 定单和客户地址信息被显示出来等待确认。
l ** 提交定单 ** – 最后的一个步骤,在这里定单被提交到数据库。
宠物店的一个例子如图:
图 1 : .net 宠物店
。 net 宠物店的总体逻辑架构如图:
图 2 : .net 宠物店逻辑架构
有三个逻辑层:表示层、中间层、数据层,这三层可以使不同特征的分布式系统进行清晰的部署,逻辑层被装成一个 .net 装配(用 C# 类库实现),对数据库的访问是用一个类来处理所有的与 SQL Server Managed provider 的交互,用存储过程来存取数据,这个系统利用了 .net 实现了完全的逻辑上的三层架构,表现了 .net 平台上的最佳实践。
图 3 : .net 宠物店系统的物理部署图
** 程序架构 ** ** **
图 4 是用来表现我们的设计的详细图,我们可以看到宠物店每层的实现和交互细节
图 4 :架构设想
** 数据库 ** ** **
数据库有如下的表
** 表名 **
|
** 解释 **
---|---
Account
|
基本的客户信息
BannerData
|
存储广告和标语信息
Category
|
类别信息 ( 如鱼类、犬类、猫类等 ).
Inventory
|
产品存货信息
Item
|
每个产品详细信息
LineItem
|
定单明细
Orders
|
客户下的定单,一个定单包含一个或一个以上定单明细
OrderStatus
|
定单状态
Product
|
产品目录 ,每个产品包含一个或者一个以上属性,典型的属性如公母。
Profile
|
客户定制的信息
Signon
|
客户登录信息
Supplier
|
有关供应方信息
** 表格 ** ** 1 ** ** :数据库表名 ** ** **
.net 宠物店的事务实现
原有的 .net 宠物店中 Order 类的 addOrder 方法所调用的存储过程中用到了数据库事务,这个调用涉及到了四个表的数据,需要定义 ACID 属性。因为如果一个定单被创建,库存数据需要被调整。存储过程利用了一个 xml 文档做参数,插入定单数据、定单明细,插入定单状态数据,更新定单里涉及到的产品的库存数据,我们的目标是从单一数据库架构变为分布式数据库架构,也就是客户、产品和库存数据存在一个数据库里面,定单存在于另外的一个数据库中。为了达到这个目标,我们需要转移到一个企业服务型架构,这是唯一的一种可以控制分布式事务和提供两阶段的提交的机制。为了转移到企业服务级,我们需要考察几种情形的影响:
l 引入企业服务类库,但是用数据库事务 /ADO.NET 事务
l 引入企业服务类库,利用它来控制事务
l 引入企业服务类库,利用它来控制分布式事务
为了实现分布式事务,我们需要修改 addOrder 方法和数据库交互的方式,在单一的数据库情形下,我们利用了一个存储过程;对于分布式,我们需要变为两个存储过程,每个数据库一个,我们意识到原先的存储过程在最后表之间用了连接,现在这些表存在于不同的数据库中,所以我们最好还是把这些实现放到中间层中,用动态生成 SQL 语句。
为了显示引入企业服务类库对于每个组件的影响,我们设计了 .net 宠物店的几个版本:
l 用最初的 .net 宠物店 v1.5 作为基础
l 利用 ADO.NET 事务的 .net 宠物店
l 使用企业服务类库和 ADO.NET 事务(企业服务的事务属性设置为 ” 不支持 ” )
l 利用企业服务的事务(事务属性在 Order 组件被设置为 ” 需要 ” , ADO.NET 的事务去掉)
l 利用企业服务来处理分布式事务
分布式情形下的数据库设计
图 5 :宠物店数据库模型
图 6 :定单数据库模型
.net 的事务机制
.net 开发者可以使用四种机制:
l 数据库事务
l ADO.NET 事务
l ASP.NET 事务
l 企业服务级事务
每种机制在以下的几方面有各自的优势和劣势:性能、代码数量、部署设置。许多开发者都很熟悉数据库的事务,在这种情形下,中间层调用数据库的存储过程,存储过程中开始一个事务,如果每个语句都执行成功则提交,如果有错误发生时就会回滚。<SPA