返回“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: 为了更新或删除能够成功,原始值必须与数据库中相应的值一致