开放式并发 ,数据绑定控件和数据源控件(sqldatasource)返回的数据库副本dataview(dataset)

   数据源控件(sqldatasource)根据select命令从数据库取出数据后,生成一个dataview(dataset)给一个数据绑定控件(列表式数据绑定控件,表格式数据绑定控件,层次数据绑定控件)。数据绑定控件自己维护这个dataview(dataset)当数据绑定控件每次显示数据都是从自身维护的dataview(dataset)中取得。每次执行update,delete中where子句的数据也是从自己维护的dataview(dataset)中取得而如果数据绑定控件显式使用databind()方法时(数据绑定控件没有select事件),就是明确要求数据源控件(sqldatasource)再返回一个新的dataview(dataset)给他。而当数据绑定控件执行update,delete在指定where子句时把整个一行每列的原始值作为判断条件,从而使更新和删除更加安全,因为数据绑定控件维护的dataview(dataset)是数据库的一个缓存,我们没法知道数据库此时的数据是否有改变,在where子句中把整个一行每列的原始值作为判断条件(dataset的每一行通过System.Data.DataRowVersion维护4个状态)可以防止更新 数据源控件(sqldatasource)给数据绑定控件返回dataview(dataset)后数据库中更新的数据 或删除 数据源控件(sqldatasource)给数据绑定控件返回dataview(dataset)后数据库中删除的数据。

举个例子

数据库中表chl(假设只有1行)
a b c
1 2 2
数据源控件(sqldatasource)给数据绑定控件返回数据库这个表的一个副本dataview(dataset)
a b c
1 2 2
数据库chl表被修改了
a b c
1 2 3
数据绑定控件也要修改这条数据,如果没有开放式并发,这条sql语句可能这么写 update chl set c=3 where a=1,数据库的表又被修改了一次
但如果使用开放式并发,这条ql语句可能这么写 update chl set c=3 where a=1,b=2,c=2 (注意where后面的3个值都是这一行的原始值,也就是用DataRow. ["a",DataRowVersion.Original],DataRow.["b",DataRowVersion.Original],DataRow.["c",DataRowVersion.Original]取得的值。这样利用数据源控件(sqldatasource)执行这条更新,在数据库中已经找不到这行了,因为在为数据绑定控件返回dataview(dataset)后被修改了。

通过开放式并发和保守式并发(更新,删除操作时给行加锁)能更好的保护数据

在多用户环境中,有两种用于更新数据库中数据的模型: 开放式并发和保守式并发。设计 DataSet 对象的目的是为了促进将 开放式并发用于长时间运行的活动,例如当您对数据进行远程处理以及当用户与数据进行交互时。

保守式并发涉及到锁定数据源中的行,以防止用户因修改数据而影响其他用户。在保守式模型中,当用户执行会应用锁的操作时,其他用户将无法执行可能与锁发生 冲突的操作,直到锁所有者释放锁为止。此模型主要用于以下环境:对数据存在激烈争用;用锁保护数据的成本小于在发生并发冲突时回滚事务的成本。

因此,在保守式并发模型中,如果用户在读取某行时有将其更改的意图,他将建立一个锁。在该用户完成更新并释放锁之前,其他任何用户都无法更改锁定行。因 此,如果锁定时间将会比较短(例如在以编程方式处理记录时)时,最好实现保守式并发。当用户与数据进行交互时,保守式并发并不是可伸缩的选项,它会使记录 被锁定相对长的时间。

对比之下,使用 开放式并发的用户在读取行时不会锁定该行。当用户要更新某行时,应用程序必须确定自读取该行以来,其他用户是否更改了该行。 开放式并发通常用于对数据争用较小的环境。由于不需要锁定任何记录,它将会提高性能,因为锁定记录需要附加的服务器资源。另外,为了维护记录锁,需要与数据库服务器保持持久连接。由于在 开放式并发模型中并不会这样,所以与服务器的连接可以在较少的时间内为大量的客户端提供服务。

开放式并发模型中,如果当某用户接收到来自数据库的值后,另一用户在该用户试图修改该值之前即将其修改,则认为发生了冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值