Slide Title,Body Text,Second level,Third level,Fourth level,Fifth level,Slide Title,Body Text,Second level,Third level,Fourth level,Fifth level,深入,ADO.NET,开发,高级数据访问技术,基础预习,熟悉,Microsoft ADO.NET,了解,Web Services,基础开发,熟悉,.NET,文件集操作,LEVEL 400,议题,并发,连接池,事务,可抽取的数据访问层,并发性问题,在可断开连接架构中必须要面对并发问题,当两个,(,或多个,),用户获取并修改相同的记录,然后试图同时维持各自的修改时,将会发生冲突:脏读,不可重复读,虚幻读,当提交多个更新的时候,会造成部分更新无法正确完成,悲观与乐观(,ADO.NET,构建)并发锁,ADO.NET,中对并发性问题的处理,与,DataAdapter,对象相连接的,DataSet,对象使用乐观锁来处理记录内容冲突,如果使用用户存储过程来替代表操作的话,并发问题的处理还需要一些额外的工作,Data Adapter,配置向导能够创建存储过程来处理这个问题,当,ContinueUpdateOnError,为,false(,缺省值,),时,在发生第一个冲突的时候会抛出,DBConcurrencyException,异常,捕获该异常并且通知用户,或者处理该异常或提示用户下一步需要做出哪些选择,并发:在.NET中使用乐观锁的处理步骤,DataSet changes=myDataSet.GetChanges();,try,mySqlDataAdapter.Update(changes);,myDataSet.Merge(changes);,catch(DBConcurrencyException e),/,通知用户记录从上次更新到现在已经发生过变化,放弃更新,finally.,更高级的操作模型,DataSet changes=myDataSet.GetChanges();,try,mySqlDataAdapter.ContinueOnError=true;,mySqlDataAdapter.Update(changes);,if(changes.HasErrors),/,获取错误,DataRow collisions=changes.Tables0.GetErrors();,/,处理错误,演示一,处理并发性问题,连接池,连接池可以极大地提升性能和可扩展性,避免由创建连接所带来的大量消耗,通过在连接字符串中添加以下属性来调节连接池,:,Pooling=true;Max Pool Size=5;Min Pool Size=3;,上面的字符串将打开连接池,并且确保在连接池中至少存在着,3,个连接,并且最多为,5,个连接,当达到最大连接时,打开新链接的请求将排队一段可配置的时间。,注意,链接是通过对链接字符串精确匹配的法则被池化的。池化机制对名称,-,值对间的空格敏感。,例如,下面的两个链接字符串将生成单独的池,因为第二个字符串包含了一个额外的空字符。,Integrated Security=SSPI;Database=Northwind,Integrated Security=SSPI;Database=Northwind,演示二,连接池,事务,ACID,原则,:,原子性,一致性,隔离性,持久性,事务行为要么完成所有动作,要么不做任何动作,同时提交或者回滚所有的修改,不是所有的,SQL,语句都允许出现在事务中,ADO.NET,事务只能应用于单一链接中,SqlTransaction,对象从,SqlConnection.BeginTransaction(),方法中返回,SqlTransaction,类,SqlTransaction trans=conn.BeginTransaction();,隔离级别枚举,(IsolationLevel):ReadCommitted,ReadUncommitted,RepeatableRead,Serializable,Unspecified,Serializable,是最高级别的隔离,/,处理工作,Insert,Update,Delete,/,要么提交所有的修改,trans.Commit();,/,要么如果发生错误,撤回所有的修改,trans.RollBack();,隔离级别,隔离级别,脏读,不可重复读,虚幻读,ReadUncommitted,是,是,是,ReadCommitted,否,是,是,RepeatableRead,否,否,是,Serializable,否,否,否,Serializable,提供了最高的隔离级别,但却只有最低的执行效率,演示三,本地事务操作,高级事务,为了执行跨数据库事务,需要通过,System.EnterpriseServices,向分布式事务协调器,(DTC),注册链接,在中间层,Web,服务上添加,:System.EnterpriseServices.Transaction,属性,TransactionOption,枚举,:Disabled,NotSupported,Required,RequiresNew,Supported,TransactionIsolationLevel,枚举,:ReadCommitted,ReadUnCommitted,RepeatableRead,Serializable,Serializable,是最高级别的隔离,连接字符串中的,Enlist,项表明链接是否参与到事务操作中。,当链接字符串中,Enlist=false,时,可以调用,SqlConnection.EnlistDistributedTransaction,方法以执行事务操作,演示四,跨数据库事务,层次化应用程序架构,多层应用程序将代码分为不同的逻辑代码层,非常普遍的设计方案是,3,层架构设计,:,表示层,业务逻辑层和数据访问层,.,合理的层次化设计带来了很多益处,:,代码复用,可扩展性,封装性,松散的耦合性,高聚合性,我们能够设计一个可抽取的数据访问层来完全抽象数据存储,概念层次化应用程序架构,可抽取数据访问层,可抽取组件在获得扩展性方面是一种强有力的方法,设计可抽取,DAL,可以很容易地修改,更新甚至更改数据存储而不需要重编译其它层,通过接口实现松耦合度,通过基于接口的工厂模式以实现可抽取组件,将数据访问层从业务逻辑层中完全抽象出来,概念数据访问层,(DAL),位于应用程序的业务逻辑与数据存储之间的代码层,包含了应用程序所有的数据访问代码,;,提供,CRUD,操作函数,.,在,.NET,中,这是包含,ADO,代码方法的基本文件集,表示层只与业务逻辑层有松散的耦合关系,业务逻辑层只与数据访问层有松散的耦合关系,概念基于接口的编程,接口类似于合同,基于接口的编程消除了从实际代码中实现的方法的耦合性,提供了多态机制,实现,可抽取,组件,概念可抽取组件,.NET,允许通过,Assembly.Load(),以及,Assembly.CreateInstance(),来动态加载文件集和类,通过配置指向具体的,DAL,类,新的,或者,改进的,(,不同,),组件可以,插入,到现存的应用程序中,不需要重新编译那些依赖接口的代码,非常低的耦合意味着极大的可扩展性,演示五,可抽取数据访问层,总结,并发问题是在可断开链接数据模型中必须要处理的问题,连接池能够改进性能和扩展性,事务确保数据的更新的原子性,持续性,隔离性和持久性,可抽取数据访问层是通过松耦合实现可扩展性的强有力的方法,