首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

多用户更新

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已经实现了这个方法。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论