.NET 数据访问架构指南

2016-01-29 13:28 5 1 收藏

.NET 数据访问架构指南,.NET 数据访问架构指南

【 tulaoshi.com - ASP.NET 】

使用自动化事务 
自动化事务简化了编程模型,因为它们不需要明确地开始新事务处理过程,或明确执行或取消事务。然而,自动化事务的最大优点是它们能与DTC结合起来,这就使单个事务可以扩展到多个分布式数据源中。在大型分布式应用程序中,这个优点是很重要的。尽管通过手工对DTC直接编程来控制分布式事务是可能的,但自动化事务处理极大的简化了工作量,并且它是为基于组件的系统而设计的。例如,可以方便地以说明方式配置多个组件以执行包含了单个事务处理的任务。 
自动化事务依赖于COM+提供的分布式事务处理支持特性。结果,只有服务组件(即从ServicedComponent类中派生的组件)能够使用自动化事务。 
要为自动化事务处理配置类,操作如下: 
从位于EnterpriseServices名称空间的ServicedComponent类中派生新类。 
通过Transaction属性定义类的事务处理需求。来自TransactionOption的枚举值决定了如何在COM+类中配置类。可与此属性一同设置的其它属性包括事务处理分离等级和超时上限。 
为了避免必须明确选出事务处理结果,可以用AutoComplete属性对方法进行注释。如果这些方法释放异常,事务将自动取消。注意,如果需要,仍可以直接挑选事务处理结果。更多详情,见本文稍后确定事务处理结果的节。 
更多信息 
关于COM+自动化事务的更多信息,可在平台SDK文档中搜索“通过COM+的自动化事务”获取。 
关于.NE T事务处理类的示例,见附录中的如何编码.NET事务处理。 
配置事务处理分离级别 
用于COM+1.0版--即运行在Windows 2000中的COM+--的事务处理分离级别被序列化了。这样做提供了最高的分离等级,却是以性能为代价的。系统的整体吞吐量被降低了。因为所涉及到的资源管理器(典型地是数据库)在事务处理期间必须保持读和写锁。在此期间,其它所有事务处理都被阻断了,这种情况将对应用程序的扩展能力产生极大冲击。 
随微软Windows .NET发行的COM+ 1.5版允许有COM+目录中按组件配置事务处理分离等级。与事务中根组件相关的设置决定了事务处理的分离等级。另外,同一事务流中的内部子组件拥有的事务处理等级必须不能高于要组件所定义的等级。如果不是这样,当子组件实例化时,将导致错误。 
对.NET管理类,Transaction属性支持所有的公有Isolation属性。你可以用此属性陈述式地指定一特殊分离等级,如下面的代码所示: 
[Transaction(TransactionOption.Supported, Isolation=TransactionIsolationLevel.ReadCommitted)] 
public class Account : ServicedComponent 

. . . 

更多信息 
关于配置事务处理分离等级及其它Windows .NET COM+增强特性的更多信息,见MSDN杂志2001年8月期的“Windows XP:利用COM+ 1.5的增强特性使你的组件更强壮”一文。 
确定事务处理结果 
在单个事务流的所有事务处理组件上下文中,自动化事务处理结果由事务取消标志和一致性标志的状态决定。当事务流中的根组件成为非活动状态(并且控制权返回调用者)时,确定事务处理结果。这种情况在图5中得到了演示,此图显示的是一个典型的银行基金传送事务。 

图5 事务流上下文 
当根对象(在本例中是对象)变为非活动状态,并且客户的方法调用返回时,确定事务处理结果。在任何上下文中的任何一致性标志被设为假,或如果事务处理取消标志设为真,那么底层的物理DTC事务将被取消。 
可以以下面两种方式之一从.NET对象中控制事务处理结果: 
可以用AutoComplete属性对方法进行注释,并让.NET自动存放将决定事务处理结果投票。如果方法释放异常,利用此属性,一致性标志自动地被设为假(此值最终使事务取消)。如果方法返回而没有释放异常,那么一致性标志将设为真,此值指出组件乐于执行事务。这并没有得到保证,因为它依赖于同一事务流中其它对象的投票。 
可以调用ContextUtil类的静态方法SetComplete或 SetAbort,这些方法分别将一致性标志设为真或假。 
严重性大于10的SQL Server错误将导致管理数据供应器释放SqlException类型的异常。如果方法缓存并处理异常,就要确保或者通过手工取消了事务,或者方法被标记了[AutoComplete],以保证异常能传递回调用者。 
AutoComplete方法 
对于标记了属性的方法,执行下面操作: 
将SqlException传递加调用堆栈。 
将SqlException封装在外部例外中,并传递回调用者。也可以将异常封装在对调用者更有意义的异常类型中。 
异常如果不能传递,将导致对象不会提出取消事务,从而忽视数据库错误。这意味着共享同一事务流的其它对象的成功操作将被提交。 
下面的代码缓存了SqlException,然后将它直接传递回调用者。事务处理最终将被取消,因为对象的一致性

来源:http://www.tulaoshi.com/n/20160129/1490298.html

延伸阅读
标签: Web开发
在网络浏览器软件中,可以Internet Explorer (IE)现在是一种标准的软件。可以看到,运行不同版本的Windows操作系统(和很多其他的操作系统)的每一台机器几乎都使用IE。微软已经通过ActiveX控件将IE的功能包含在执行成熟的XML处理技术中。 在本篇文章中,我们将讲述如何在IE中使用ActiveX功能来访问并解析XML文档,由此允许网络冲浪者操...
访问其它MicrosoftJet数据库(.mdb)中的数据,包括用M1crosoftJet的老版本建的各种数据库。 1.链接外部MicrosoftJet表 为了在本地MicrosoftJet数据库中链接外部MicrosoftJet表,可以先用OpenDatabase方法打开本地MicrosoftJet数据库,建立一个TableDef对象,并设置该对象的Connect和SourceTableName属性,以分别指定希望链接的外部Microso...
MicrosoftJetXbaseIISAM驱动程序支持下列版本的MicrosoftFoxPro:2.0,2.5,2.6,3.0和DBC。当通过MicrosoftJet数据库引擎访问FoxPro数据库时,还应当考虑MicrosoftJet如何处理FoxPro数据类型、已删除的记录、FoxPro索引和备注字段。为了在MicrosoftJet中访问FoxPro数据库,应指定适当的连接信息,包括: (1)源数据库类型:可以是下列中的一个:...
标签: SQLServer
  在第一部分,我们讨论了如何优化 ASP 代码。在这一部分,我们把重点放在数据访问上。 一般情况下,数据访问时间要比 ASP 代码解释,编译时间长,不要让数据检索成为影响 ASP 性能的瓶颈。 首先,讲一些老生常谈的话。比如:需要声明变量,要用 Response.Write SQL_string 来进行调试,要用 On Error Resume Next 来捕获错误。不要在 ...
一、控件名.DataBindings.Add("属性名", dataset_system.Tables("Company"), dataset_system.Tables("Company").Columns.Item(i).Caption) 属性: 如() 'TEXT' 二、ListBox与ComboBox的数所绑定 Me.ComboBox1.DataSource = dataset_system.Tables("表名") Me.ComboBox1.DisplayMember = "字段名1" Me.ComboBox1.ValueMember = "字段名2" ...

经验教程

302

收藏

98
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部