ADO.NET是微软用于操作数据的新技术。ADO.NET最值得炫耀的特性之一是DataSet对象,这个对象连同DataTable和DataRelation这两个对象一起都是用来将数据保存到内存里结构描述的对象。将整个结构描述都保存在内存里的能力让DataSet能够在完全断开的情况运行;DataSet并不知道任何底层数据源。DataSet不能够连接到数据库上;但是记录会受程序控制而被添加,并在DataSet里被操控。所以你必须编写程序将记录从DataSet里取出,在来更新底层数据源。
在连接完全断开的模型下进行操作会导致一个相当麻烦的问题:处理违反并行的问题。例如,如果Bob将来自某个数据库的的记录填进DataSet,并在连接断开的情况下对记录进行修改,而在同时,Kim正在使用另一个应用程序更新这些记录,那么如何确定当Bob对数据进行更改的时候这些记录已经被更改过了呢?现在让我们来看看ADO.NET是如何处理并行冲突检查的,在看一下如何处理违反并行的问题。
DataAdapter和最佳并行
如果你在使用Visual Studio .NET,那么你就可以使用数据适配器配置向导(Data Adapter Configuration Wizard)来生成DataAdapter里所有的命令对象(Command object)。这会让让你更加省事,虽然你总是能够自己手动生成这些命令。
很少有开发人员会注意到的是,在缺省状态下,数据适配器配置向导会生成检查违反最佳并行的SQL声明。最佳并行这个术语的意思是你会假设在你进行编辑的时候没有其他人在同时编辑同一条记录。换句话说,你认为不会有两个人在同一时间编辑同一条记录。由于你很乐观不会有两个人同时编辑同一条记录,所以当用户开始编辑它的时候就锁定这条记录。只有在有真正的(记录)更新的尝试时,你才需要进行锁定。这就只会有一个短得多的锁定事件,用数据库的术语来说,这个规则很简单:锁定是好的,但是长时间的锁定是不好的。
从这个行为不难看到:你可以在VS.NET里开始一个新的项目,再把SqlDataAdapter或者OleDbDataAdapter拖到设计器的表面。如果你使用的是向导并且选择使用SQL声明,那么向导的下一个页面就会让你输入Select声明。这个页面有一个叫做高级选项(Advanced Options)的按钮。点击这个按钮就会打开高级SQL生成选项(Advanced SQL Generation Options)对话框,在缺省状况下,使用最佳并行的选项是开启的。图A显示的是高级SQL生成选项对话框。
图A
高级选项