请教并发操作的解决方案!!!

henry2002 2003-08-21 09:33:43
如果一个页面需要更新一个数据库表中的某条记录,而有两个人(A、B)同时打开了该页面并都准备修改该条记录.如果A先修改并提交,这时数据库中是A的修改结果;然后B也提交他的修改结果,这样B就会覆盖掉A先前提交的修改。如何避免这种情况的出现???

说明:现在使用b/s结构进行开发,每个库表对应一个实体类,提交修改是先构造出要修改记录对应的实体对象,然后构造update语句进行修改(where子句使用主键进行限制)
...全文
149 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
NetAnt007 2004-01-10
  • 打赏
  • 举报
回复
http://www.microsoft.com/china/msdn/library/dv_vstechart/html/vbdatasetconflicts.asp
haipin 2004-01-10
  • 打赏
  • 举报
回复
http://www.microsoft.com/china/msdn/library/dv_vstechart/html/vbdatasetconflicts.asp
henry2002 2003-08-22
  • 打赏
  • 举报
回复
up
henry2002 2003-08-21
  • 打赏
  • 举报
回复
谢谢!
wolve你的方案能解决问题,但是实际编程是否可行?如果每次更新数据之前都要去数据库检查在自己读数据和更新数据之间数据库中数据是否已经被改变一方面性能上会很受影响(多访问一次数据库),另一方面如果库表字段少还好,如果字段很多那么比较一次也要很多脚本的。当然也可以通过update或delete语句后加where条件把原始数据都作为条件进行限制,但编程同样会很繁琐的。
因为这种控制不是某一两个表需要这样处理,而是所有的表基本都需要进行控制,能否有一种方法能让我在一个基类中进行统一控制?
wolve 2003-08-21
  • 打赏
  • 举报
回复
事务只能保持在完成原子操作之前读写问题。
你的问题是A已完成操作了,B肯定是可以进行相同的操作,难道A改了以后,所有的用户都不能改了吗,不是吧。
我知道你的意思,你可以这样,先记下A读数据时的时间,然后在A修改时判断一下,如果数据与A原来读的数据不同,在比较一下时间是不是在一定范围内,你可以提示上在他修改之前,有人已更改了该数据,问A还是不是修改该数据。
lemong 2003-08-21
  • 打赏
  • 举报
回复
用事务保护就可以
wolve 2003-08-21
  • 打赏
  • 举报
回复
没办法,问题是你这么做解决了什么问题。
henry2002 2003-08-21
  • 打赏
  • 举报
回复
谢谢samluo,时间戳应该是个不错的主意。

我看了.net中的dataadapter类有一个update方法,可以用datatable、datarow或dataset做参数,好像能自动确定哪些数据被修改或删除,然后它自己就会构造一个合适的语句进行更新或删除,而且好像能避免在读取数据和更新数据之间数据被更新的问题。
但是如果用asp.net做客户端开发,我不知道如何能保存住原先读取出来的数据。
现在做法是:要显示某条记录的信息就从数据库取出来放到一个dataset中,然后在aspx页面中显示,随后dataset对象就被抛弃。修改结束需要更新数据的时候再根据页面中的各控件数据进行更新,这样原先取出来的原始数据对应的dataset就没了,那么如何利用dataadapter的update方法呢?
samluo316 2003-08-21
  • 打赏
  • 举报
回复
用数据库中的时间戳进行比较。每个表加一个时间戳,在查询页面获取当时的时间戳,在提交更改获取删除时比较时间戳是否相同,就可以根据返回的异常进行相应的处理。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧