多用户更新
Multiuser Updates
到目前为止,还未启用优化并行(optimistic concurrency)功能支持。现在,应该回过头来检查“use optimistic concurrency”多选框,但是在这之前,先花点时间介绍一些相关概念。
在目前的情况下,都是使用SqlDataSource控件从数据库读取数据,然后把数据置入GridView。现在您已经具有了更新(或删除)数据的能力。当然,可能会有多人同时与数据库交互(很少有web应用程序仅支持单用户访问)。
很容易联想到,这可能会导致很严重的破坏数据的问题。例如,有两个人同时下载数据:
Liberty Associates, Inc. / Boston / Jesse Liberty
第一个编辑器将City从Boston改成了New York,第二个编辑器将Contact Name从Jesse Liberty改成了Milo Liberty。现在,情况变得很有趣,第一个编辑器把数据记录写了回去,数据库包括了下面的值:
Liberty Associates, Inc. / New York / Jesse Liberty
过了一会儿,第二个编辑器更新了数据库数据,数据库中则包括了如下记录:
Liberty Associates, Inc. / Boston / Milo Liberty
这些早期更新的值被重写了,从而导致数据丢失,看来这个技术有问题。
为了防止这个问题出现,可以尝试使用下面的任何一种策略:
l 锁定记录,当一个用户编辑一条记录时,其他用户只能读取记录,但不能更新这些记录,这叫做消极记录锁定(pessimistic record locking)。如果包括很多用户,那么数据库很快会被全部锁定而无法使用。
l 只更新您更改的列,这在理论上很不错,但是,这可能会导致数据库内部一致,而与实际情况完全不符。假设两个销售人员都检查同一本书的库存,NumberOnHand(目前拥有的数量)字段是1,他们把NumberOnHand字段都变成了0,数据库很高兴,但是有一个用户拿不到书,因为,每本书只能销售一次(我感到很懊丧)。为了防止这一点,只能锁住记录,然后读取数据,但我们不喜欢这个解决方案。
l 可以设置在更新之前,检查记录是否已经改变,并只对没有改变的记录做更新。不幸的是这仍然解决不了问题。如果在更新之前查看数据库,有可能在查看数据并且修改数据时,其他人已经更新了数据库。假设有足够的时间来处理事务,就可能发生数据
冲突和破坏。
因为每次更新数据,都需要访问两次数据库(先读后写),这并不是很有效率的方法。在一个高访问量的应用程序中,性能问题将是十分昂贵的。
l 如果记录已经更改,用一种保证能够产生错误的更改方式,在错误发生时,处理这些(很少发生的)错误,这被称为优化并行。.NET已经实现了这个方法。







