`
lovnet
  • 浏览: 6882627 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

用Microsoft.net实现数据库事务(一)

阅读更多

Microsoft.net实现数据库事务<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

摘要:了解.netPet Shop 2企业版本是怎样帮助企业解决实际中的业务问题,Net Pet Shop

验证了怎样利用.net框架和Visual Studio.net来开发最佳的企业级系统。就如Sun公司的Java™ Pet Store J2EE™ Blueprint application,它也是一个最佳的系统实现。

介绍

.NET 宠物店程序开发于200111月,它描述了.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 提交定单 最后的一个步骤,在这里定单被提交到数据库。

宠物店的一个例子如图:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 323.25pt; HEIGHT: 212.25pt" alt="" type="#_x0000_t75"><img o:href="file:///E:\download\net\Implementing%20Database%20Transactions%20with%20Microsoft%20_NET.files\rightframe.files\psent.files\psent1.gif" src="/Develop/ArticleImages/25/25152/CSDN_Dev_Image_2004-3-3950290.gif"><font size="3"></font></shape>

1.net宠物店

net宠物店的总体逻辑架构如图:

<shape id="_x0000_i1026" style="WIDTH: 356.25pt; HEIGHT: 339pt" alt="" type="#_x0000_t75"><img o:href="file:///E:\download\net\Implementing%20Database%20Transactions%20with%20Microsoft%20_NET.files\rightframe.files\psent.files\psent2.gif" src="/Develop/ArticleImages/25/25152/CSDN_Dev_Image_2004-3-3950292.gif"><font size="3"></font></shape>

2.net宠物店逻辑架构

有三个逻辑层:表示层、中间层、数据层,这三层可以使不同特征的分布式系统进行清晰的部署,逻辑层被装成一个.net装配(用C#类库实现),对数据库的访问是用一个类来处理所有的与SQL Server Managed provider的交互,用存储过程来存取数据,这个系统利用了.net实现了完全的逻辑上的三层架构,表现了.net平台上的最佳实践。

<shape id="_x0000_i1027" style="WIDTH: 356.25pt; HEIGHT: 215.25pt" alt="" type="#_x0000_t75"><img o:href="file:///E:\download\net\Implementing%20Database%20Transactions%20with%20Microsoft%20_NET.files\rightframe.files\psent.files\psent3.gif" src="/Develop/ArticleImages/25/25152/CSDN_Dev_Image_2004-3-3950294.gif"><font size="3"></font></shape>

3.net宠物店系统的物理部署图

程序架构

4是用来表现我们的设计的详细图,我们可以看到宠物店每层的实现和交互细节

<shape id="_x0000_i1028" style="WIDTH: 234pt; HEIGHT: 414.75pt" alt="" type="#_x0000_t75"><img o:href="file:///E:\download\net\Implementing%20Database%20Transactions%20with%20Microsoft%20_NET.files\rightframe.files\psent.files\psent4.gif" src="/Develop/ArticleImages/25/25152/CSDN_Dev_Image_2004-3-3950296.gif"><font size="3"></font></shape>

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 利用企业服务来处理分布式事务

分布式情形下的数据库设计

<shape id="_x0000_i1029" style="WIDTH: 303.75pt; HEIGHT: 577.5pt" alt="" type="#_x0000_t75"><img o:href="file:///E:\download\net\Implementing%20Database%20Transactions%20with%20Microsoft%20_NET.files\rightframe.files\psent.files\psent5.gif" src="/Develop/ArticleImages/25/25152/CSDN_Dev_Image_2004-3-3950298.gif"></shape>

5:宠物店数据库模型

<shape id="_x0000_i1030" style="WIDTH: 316.5pt; HEIGHT: 333pt" alt="" type="#_x0000_t75"><img o:href="file:///E:\download\net\Implementing%20Database%20Transactions%20with%20Microsoft%20_NET.files\rightframe.files\psent.files\psent6.gif" src="/Develop/ArticleImages/25/25152/CSDN_Dev_Image_2004-3-39502910.gif"></shape>

6:定单数据库模型

.net的事务机制

.net开发者可以使用四种机制:

l 数据库事务

l ADO.NET事务

l ASP.NET事务

l 企业服务级事务

每种机制在以下的几方面有各自的优势和劣势:性能、代码数量、部署设置。许多开发者都很熟悉数据库的事务,在这种情形下,中间层调用数据库的存储过程,存储过程中开始一个事务,如果每个语句都执行成功则提交,如果有错误发生时就会回滚。

如果你的事务需要几个调用,例如,你需要插入多个定单明细到一个表中,但不想用一个xml文档或者传递一个很长的字符串,这些都需要在存储过程中被解析,你可以用ADO.NET事务机制。ADO.NET事务允许你在当前的连接上创建一个事务上下文,运行对数据库的多次调用,在最后或者提交或者回滚。

ASP.NET事务是在Web应用程序的页面层工作,你只要简单的在页面属性中加一个 Transaction="Required”,这样在页面中的事件处理都作为页面整个事务的一部分,任何处理出现错误,则所有的处理都将回滚。

企业服务型组件通过资源管理器和分布事务控制器(DTC)来实现事务,当ASP.NET,一个数据库的调用或者事务中涉及到的其他资源发生错误或者异常时,整个事务将被回滚,企业服务建立在COM+技术的基础上来处理事务,熟悉COM+的开发者应该理解企业服务。

应该被提到实现一个事务的这些不同方式之间可能是互斥的,如果你混合使用数据库事务和企业服务事务,你就会得到一个错误,这是因为你会得到重复的提交,你在企业服务中可能提交一个在数据库事务中已经提交了的事务,这样已经没有事务上下文来进行提交动作了。同样的问题如在数据库事务中提交了一个事务,但在企业服务中却因为在系统中发生异常而回滚。

分享到:
评论

相关推荐

    ASP.NET 4.5 数据库入门经典 第3版

    在ASP.NET 4.5中,LINQ(Language Integrated Query)是一个强大的特性,它允许开发者使用类似C#或VB.NET的语法来执行数据库查询。书中会详细解释如何使用LINQ to SQL和LINQ to Entities进行数据操作,并通过实例...

    ASP.NET通用数据库访问组件

    ASP.NET通用数据库访问组件是一种软件开发工具,它提供了一种标准化的方法来访问各种类型的数据库,如MSSQL(Microsoft SQL Server)、MYSQL(MySQL Server)、ORACLE(Oracle Database)和ACCESS(Microsoft Access...

    ASP.NET与数据库程序设计

    在ASP.NET中,与数据库交互通常通过ADO.NET(ActiveX Data Objects .NET)来实现,这是.NET Framework的一部分,提供了对各种数据库系统的访问能力。ADO.NET模型由几个主要组件组成:DataSets、DataTables、Data...

    vb.net连接数据库全集

    在VB.NET编程环境中,连接数据库是一项基础且至关重要的任务,特别是在开发数据驱动的应用程序时。VB.NET提供了多种方法来连接和操作SQL数据库,这使得开发者能够高效地与各种类型的数据库进行交互。以下是对"vb.net...

    ASP.NET2.0数据库高级编程

    《ASP.NET 2.0 数据库高级编程》是Wrox出版社出版的一本深入探讨ASP.NET 2.0数据库开发的专业书籍。这本书旨在帮助开发者掌握在ASP.NET 2.0环境中进行高效、安全且灵活的数据库操作的核心技术。以下是一些关键知识点...

    基于VB.NET的数据库应用程序设计

    【标题】"基于VB.NET的数据库应用程序设计"深入探讨了如何使用Microsoft的VB.NET编程语言来构建与数据库交互的应用程序。在VB.NET中,数据库应用是通过ADO.NET框架实现的,这是一个强大的工具集,用于访问各种关系型...

    ADO.NET访问数据库.rar_mysteriousi9b_基于ADO.net的数据库访问_数据库_访问数据库

    ADO.NET是微软.NET Framework的一部分,它提供了一组用于访问数据库的类库,支持与各种数据库(如SQL Server、Oracle、MySQL等)的交互。其核心组件包括:DataSet、DataTable、DataAdapter、Connection、Command、...

    Visual Basic.NET 与数据库开发

    在IT行业中,数据库开发是至关重要的领域,而Visual Basic.NET(简称VB.NET)作为微软.NET框架的一部分,提供了强大的工具和库来实现这一目标。本文将深入探讨VB.NET与数据库开发的相关知识点,帮助开发者掌握如何...

    vb.net 操作Access数据库

    在VB.NET编程环境中,操作Access数据库是一项常见的任务,这主要涉及到ADO.NET库的使用,它提供了与各种数据库交互的能力。本篇文章将详细讲解如何利用VB.NET进行Access数据库的增删改查操作。 首先,我们需要引入...

    asp.net 全能数据库

    综上所述,【asp.net 全能数据库】是一个全面的数据库解决方案,它结合了数据库连接、SQL执行、ORM、事务管理等多种功能,旨在为ASP.NET开发者提供强大且易用的数据库操作工具。开源的性质使得开发者可以根据需要...

    c# asp.net实现sql server数据库备份

    本教程将详细介绍如何使用C#和ASP.NET来实现SQL Server数据库的备份。 首先,我们需要理解SQL Server的备份机制。SQL Server提供了多种备份类型,包括完整备份、差异备份、日志备份等。完整备份会保存整个数据库,...

    VB.NET 针对数据库操作的程序

    你可以使用Transaction对象来管理数据库事务,确保一组操作要么全部成功,要么全部回滚。例如: ```vb.net Using transaction As SqlTransaction = connection.BeginTransaction() Try ' 执行一系列数据库操作 ...

    VB.NET与数据库开发

    7.事务处理:在VB.NET中,SqlConnection对象支持事务处理,可以确保一系列数据库操作的原子性。使用BeginTransaction、Commit和Rollback方法来控制事务的开始、提交和回滚。 8. 错误处理:VB.NET提供了Try...Catch....

    基于ASP.NET和数据库的网页设计

    ASP.NET是由微软开发的一种服务器端Web应用程序框架,用于构建动态网站、Web应用程序和Web服务。它基于.NET Framework,提供了一种高效、安全、可扩展的平台来构建高性能的Web应用程序。ASP.NET的核心优势在于其内置...

    ASP.NET与数据库程序设计教程

    ASP.NET 是微软公司开发的一种用于构建动态网站、Web 应用和Web 服务的技术框架,它基于.NET Framework,提供了一套高效、安全且易于维护的Web 开发平台。本教程将深入探讨如何在ASP.NET环境下进行数据库程序设计,...

    《VB.NET+数据库入门经典(第2版)》.rar

    VB.NET是微软.NET框架下的一个面向对象的编程语言,它提供了丰富的功能和易用性,使得开发者能够轻松创建桌面、Web和移动应用。而数据库则是存储和管理数据的核心工具,对于任何应用程序来说,理解和掌握如何使用...

    ASP.NET 连接数据库Microsoft .dll文件

    综上所述,ASP.NET连接数据库Microsoft .dll文件涉及到的关键知识点包括ADO.NET架构、Oracle数据提供者、数据库连接字符串配置、数据库操作类的使用以及最佳实践。在实际开发中,正确理解和运用这些知识点将有助于...

    ASP.NET 2.0 数据库项目案例导航

    ASP.NET 2.0 是微软开发的一个用于构建Web应用程序的框架,它在.NET Framework 2.0的基础上提供了更丰富的功能和更高的开发效率。这个“ASP.NET 2.0 数据库项目案例导航”很可能是针对使用ASP.NET 2.0进行数据库交互...

    精通C#与.NET 4.0数据库开发PPT

    在数据库操作方面,课程会涵盖CRUD(创建、读取、更新和删除)操作的实现方法,以及事务管理,确保数据的一致性和完整性。此外,还将讨论存储过程和用户定义函数的使用,以及如何优化查询性能。 课程可能还会涉及...

Global site tag (gtag.js) - Google Analytics