ASP.NET 2.0数据教程之四十一:实现开放式并发2010-08-11 翻译:cnblogs 有些伤感返回“”导言对于可能存在多用户同时更新或删除数据的web程序来说,存在一 个用户的修改覆盖另一个用户的情况。当设计这样的程序时,选择适当的并发控 制技术非常重要。我们在实现开放式并发里已经讨论过,有三种concurrency control (并发控制)的策略:什么都不做—如果并发用户修改的 是同一条记录,让最后提交的结果生效(默认的行为)开放式并发 (Optimistic Concurrency) — 假定并发冲突只是偶尔发生,绝大多数的 时候并不会出现; 那么,当发生一个冲突时,仅仅简单的告知用户,他所作的更 改不能保存,因为别的用户已经修改了同一条记录保守式并发 (Pessimistic Concurrency )— 假定并发冲突经常发生,并且用户不能 容忍被告知自己的修改不能保存是由于别人的并发行为;那么,当一个用户开始 编辑一条记录,锁定该记录,从而防止其他用户编辑或删除该记录,直到他完成 并提交自己的更改目前为止我们编辑DataList 的教程都是使用的默认的 策略—也就是我们让最后写的结果生效。本章我们学习如何使用开放式并发 。第一步: 理解开放式并发是如何实现的开放式并发控制能够确 保一条记录在更新或者删除时跟它开始这次更新或修改过程时保持一致。例如, 当在一个可编辑的DataList里点击编辑按钮时,该记录的原始值从数据库中读取 出来并显示在TextBox和其他Web控件中。这些原始的值需要被保存下来。随后, 当用户完成他的修改并点击更新按钮,这些原始值加上修改后的新值发送到业务 逻辑层,然后到数据访问层。数据访问层发出一个SQL语句,它将仅仅更新那些开 始编辑时的原始值根数据库中的值一致的记录。图一描述了这些事件发生的顺序 。

图1: 为了更新或删除能够成功,原始值必须与数据库中相应的值一致有多种方法可以实现开放式并发控制(查看Peter A. Bromberg的文章 Optmistic Concurrency Updating Logic,从摘要中看到许多选择)。ADO.NET类 型化数据集提供了一种应用,这只需要在配置时勾选上一个CheckBox。开启 TableAdapter 的开放并发需要在TableAdapter 的Update和Delete语句后面加一 个比较所有原始值的WHERE从句。我们在实现开放式并发里创建了一个这样的类型 化数据集(名为NorthwindOptimisticConcurrency)和一个名为 ProductsOptimisticConcurrencyBLL的BLL类。本章我们将使用上面的方 法创建一个DataList。注意:在继续前请阅读实现开放式并发 ,它提供 了关于开放并发如何工作和如何让BLL和DAL执行开放并发的详细信息。第 二步:创建一个可编辑和删除的 DataList使用DataList执行开放并发时 ,需要我们保存原始值 —更新或删除时的值— 然后将这些值连同新 的值一起传到BLL。首先我们来创建一个可编辑和删除的DataList,它列出 product,并允许修改name和price。打开EditDeleteDataList文件夹下的 OptimisticConcurrency.aspx页。拖一个DataList进来。并将ID设为Products。 通过它的智能标签,创建一个名为ProductsDataSource的ObjectDataSource,并 用ProductsBLL类的GetProducts()方法配置它。在UPDATE,INSERT,DELETE标签里 选择(None).

图 2: 在UPDATE, INSERT, DELETE标签里选择 (None)