ASP.NET 2.0数据操作教程之二十一 实现开放式并发

返回“ASP.NET 2.0数据教程目录”

导言

对于那些仅仅允许用户查看数据,或者仅有一个用户可以修改数 据的web应用软件,不存在多用户并发冲突的问题。然而对于那些允许多个用户修 改或删除数据的web应用软件,则有可能发生一个用户所做的更改与另一个并发用 户的更改冲突。在没有任何并发策略的地方,当两个用户同时编辑某一条记录, 最后提交的用户的更改将覆盖先提交的用户所作的更改。

例如,假设两个 用户,Jisun和Sam,都访问我们的应用软件中的一个页面,这个页面允许访问者 通过一个GridView控件更新和删除产品数据。他们都同时点击GridView控件中的 Edit按钮。Jisun把产品名称更改为“Chai Tea”并点击Update按钮, 实质结果是向数据库发送一个UPDATE语句,它将更新此产品的所有可修改的字段 (尽管Jisun实际上只修改了一个字段:ProductName)。在这一刻,数据库中包 含有这条产品记录“Chai Tea”—种类为Beverages、供应商为 Exotic Liquids、等该产品的详细信息。然而,在Sam的屏幕中的GridView里,当 前编辑行里显示的产片名称依旧是“Chai”。在Jisun的更改被提交后 片刻,Sam把种类更改为“Condiments”并点击Update按钮。这个发送 到数据库的UPDATE语句的结果是将产品名称更改为“Chai”、 CategoryID字段的值是种类Beverages对应的ID,等等。Jisun所作的对产品名称 的更改就被覆盖了。图1展示了这些连续的事件。


图 1: 当两个用户同时更新一条记录,则存在一个用户的更改覆盖另一 个的更改的可能性

类似地,当两个用户同时访问一个页面,一个用户可能 更新的事另一个用户已经删除的记录。或者,在一个用户加载页面跟他点击删除 按钮之间的时间里,另一个用户修改了这条记录的内容。

有下面三中并发 控制策略可供选择:

Ø什么都不做 –如果并发用户修改的是 同一条记录,让最后提交的结果生效(默认的行为)

Ø开放式并发 (Optimistic Concurrency) - 假定并发冲突只是偶尔发生,绝大多数的时候并 不会出现; 那么,当发生一个冲突时,仅仅简单的告知用户,他所作的更改不能 保存,因为别的用户已经修改了同一条记录

Ø保守式并发 (Pessimistic Concurrency) – 假定并发冲突经常发生,并且用户不能 容忍被告知自己的修改不能保存是由于别人的并发行为;那么,当一个用户开始 编辑一条记录,锁定该记录,从而防止其他用户编辑或删除该记录,直到他完成 并提交自己的更改

注意:在本节里,我们不讨论保守式并附的例子。保守 式并发控制很少使用,因为锁定如果没有完全释放,会妨碍其他用户进行数据更 新。例如,如果一个用户为了编辑而锁定某一条记录,但在解锁之前就离开了, 那么其他任何用户都不能更新这条记录,直到最初的用户返回并完成他的更新。 因此,使用保守式并发控制的地方,相应地会作一个时间限制,如果到达这个时 间限制,则取消锁定。例如订票网站,当用户完成他的订票过程时会锁定某个特 定的座位,这就是一个使用保守式并发控制的例子。

第一步:如何实现开 放式并发控制

开放式并发控制能够确保一条记录在更新或者删除时跟它开 始这次更新或修改过程时保持一致。例如,当在一个可编辑的GridView里点击编 辑按钮时,该记录的原始值从数据库中读取出来并显示在TextBox和其他Web控件 中。这些原始的值保存在GridView里。随后,当用户完成他的修改并点击更新按 钮,这些原始值加上修改后的新值发送到业务逻辑层,然后到数据访问层。数据 访问层必定发出一个SQL语句,它将仅仅更新那些开始编辑时的原始值根数据库中 的值一致的记录。图二描述了这些事件发生的顺序。


图2: 为了更新或删除能够成功,原始值必须与数据库中相应的值一致

时间: 2024-11-15 23:12:28

ASP.NET 2.0数据操作教程之二十一 实现开放式并发的相关文章

ASP.NET 2.0数据操作教程之二十二:为删除数据添加客户端确认

返回"ASP.NET 2.0数据教程目录" 导言 在前面一些教程中,我们已经看到如何使用应用程序框架, ObjectDataSource,以及那些提供增.改.删功能的数据Web控件.在我们已经实 现的删除数据的界面中,包含一个删除按钮,当点击它的时候,会导致数据回传 以及调用ObjectDataSource的Delete()方法.然后Delete()方法会调用对应业务 逻辑层中的方法,再进入数据访问层,直至调用最终操作数据库的DELETE语句. 虽然这个界面已经能够让用户通过GridV

ASP.NET 2.0数据操作教程之二十:定制数据修改界面

返回"ASP.NET 2.0数据教程目录" 目录 简介 一.重载UpdateProduct方法 二.手工处理可 编辑的GridView 三.在编辑界面中使用DropDownList显示Category和 Supplier 四.用RadioButton表示Discontinued状态 小结 简介 GridView和DetailsView控件通过绑定列和CheckBox列,可以简化数 据编辑界面制作,呈现只读,编辑和新增界面,我们不需要增加元素标记或编写 任何额外代码就可以得到这些界面.然

Scott Mitchell的ASP.NET 2.0数据操作教程之八:使用两个DropDownList过滤的主

Scott Mitchell 的ASP.NET 2.0数据操作教程之八:使用两个DropDownList过滤的主/从报表 返回"ASP.NET 2.0数据教程目录" 导言 在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报 表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定 类别的产品. 这类报表用于显示具有一对多关系的记录时非常合适, 同时它也可 以很容易的被扩展以显示多个一对多关系的数据. 比如, 一个订单系

Scott Mitchell的ASP.NET 2.0数据操作教程之七:使用DropDownList过滤的主/从

Scott Mitchell的ASP.NET 2.0数据操作教程之七:使用DropDownList过滤的主/从报表 返回"ASP.NET 2.0数据教程目录" 导言 主/从报表是一种很常见的报表, 这类报表中首先会显示一些主记 录. 然后用户可以深入(追溯)某条主记录来查看该主记录的详情. 主/从报表是显 示一对多关系的理想选择, 比如一个报表显示所有的产品类别,然后根据用户选择 的特定类别显示与之关联的产品. 另外, 主/从表在显示"宽"表(有 很多列的表)的详细

ASP.NET 2.0数据操作教程之十九:给编辑和新增界面增加验证控件

返回"ASP.NET 2.0数据教程目录" 译注:Scott Mitchell写的46篇(现在发布了前15篇)ASP.NET2.0教程系列第 19篇译文,原文尚未发布,Word文档可以在这里下载中英混排版本,这里下载中 文版本 目录 简介 一.从<Examining the Events Associated with Inserting, Updating, and Deleting >中复制代码 二.将绑定列 转换为模板列 三.为GridView的项编辑模板(EditI

Scott Mitchell的ASP.NET 2.0数据操作教程之十:使用GridView和DetailView实

Scott Mitchell 的ASP.NET 2.0数据操作教程之十:使用GridView和DetailView实现的主/从报表 返回"ASP.NET 2.0数据教程目录" 导言 在前面的教程我们看到了如何使用两个页面(一个主页,用于列出供应 商; 一个明细页,用于显示选定供应商提供的产品)创建主/从报表 . 这种两个页 面的报表格式也可以集中在一个页面上. 这篇教程将会使用一个GridView, 它的 每一行都包含产品的名称和单价以及一个选择按钮. 单击一个产品的选择按钮会 在同一

Scott Mitchell的ASP.NET 2.0数据操作教程之九:跨页面的主/从报表

返回"ASP.NET 2.0数据教程目录" 导言 在前面的两篇教程中,我们看到了如何在单一页面中显示主/从报表, 它使用DropDownList显示主记录,使用GridView或DetailsView显示详细信息. 另 外一种常见的主/从报表模式是在一个页面中显示主记录而在另一个页面中显示详 细信息.互联网上的论坛,如www.asp.net ,就是该模式在实际应用中非常典型例子 . Asp.Net论坛由多个子论坛组成: Getting Started, Web Forms, Data

ASP.NET 2.0数据操作之创建业务逻辑层

导言 本教程的第一节所描述的数据访问层(Data Access Layer,以下简称为DAL)已经清晰地将表示逻辑与数据访问逻辑区分开了.不过,即使DAL将数据访问的细节从表示层中分离出来了,可它却不能处理任何的业务规则.比如说,我们可能不希望产品表中那些被标记为"停用"的产品的"分类编号"或"供应商编号"被更新:我们还可能需要应用一些资历规则,比如说我们都不希望被比自己的资历还要浅的人管理.另外一个比较常见的情况就是授权,比如说只有那些具有特殊

ASP.NET 2.0数据教程目录

ASP.NET 2.0数据教程作者为Scott Mitchell (英文版地址:http://www.asp.net/learn/data-access/tutorial-01-cs.aspx),并由思归呓语.Reeezak.横刀天笑.Eddie005.立冬.zhzkl.Truly.Chagel.LoveCherry.有些伤感.ksnoopy.王文涛共同翻译完成. ASP.NET 2.0数据教程之一: 创建一个数据访问层 ASP.NET 2.0数据教程之二:创建一个业务逻辑层 ASP.NET 2