首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • |zyciis| 如何解决当修改一条记录的时候而另一个人也在修改这条数据,当出现这种情况的时候,大家是怎么解决的? 谢谢 [已结贴,结贴人:zyciis800]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zyciis800
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-12 06:38:53 楼主
    如我的表记录
    ID  Name phone          address
    1  小张  13800138000    广东广州
    ---------------------------------------------
    那么就有一个UserEdit.aspx页面
    打开这个页面就传相应的ID进来,
    然后在这个页面里面修改他的一些数据
    点确定提交

    但现在用这种方法的话就会出现一个问题如:
    举例现在有A用户B用户同时打开UserEdit.aspx?ID=1这个页面
    A修改了他的phone = 1860 提交
    B修改了他的address = 广东深圳
    ---------------------------------------------
    这时问题就出来了,因为A提交后的数据更新到数据库就为
    ID  Name phone          address
    1  小张  1860了          广东广州
    但这时因为B已经在A更新之前就已经打开了这个页面
    他的信息还是A没提交前的数据
    这时B提交后数据库就为
    ID  Name phone          address
    1  小张  13800138000    广东深圳
    这时的问题就会是A的操作已经没有作用了

    像上面的问题大家是怎么来解决的呢

    以下是我想的方法
    用隐藏控件来记录原来的数据,
    当用户提交更新的时候判断数据库里面的数据是否和隐藏控件里面的数据一致
    如果不一致,提示要重新加载数据
    但这样的话操作和代码页面方法会变得很复杂

    要怎么办呢

    谢谢
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maco_wang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 08:01:531楼 得分:5
    给取出的数据进行加锁
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maco_wang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 08:06:222楼 得分:5
    SQL code
    --1 如何锁一个表的某一行 --A 连接中执行 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ begin tran select * from tablename with (rowlock) where id=3 waitfor delay ’00:00:05commit tran --B连接中如果执行 update tablename set colname=10where id=3 --则要等待5秒 update tablename set colname=10where id<>3 --可立即执行

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maco_wang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 08:08:133楼 得分:5
    http://blog.csdn.net/cspyb/archive/2007/11/04/1865538.aspx
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maco_wang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 08:09:324楼 得分:5
    当某人取出某条信息时,进行加锁。其他人就不能再进行修改了。
    当他编辑完后,或是取消了,就解锁。
    具体的,如果不明白可以看上面的链接。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wwbjj007
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 08:18:065楼 得分:5
    学习 .....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhang777xiao777wei
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 08:35:566楼 得分:5
    该回复于2008-05-16 16:35:47被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lovehongyun
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 08:43:527楼 得分:5
    数据并发问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lovehongyun
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 08:46:088楼 得分:5
    时间戳

    http://www.cnblogs.com/tintown/archive/2005/03/22/123404.html
    http://www.cnblogs.com/hedonister/archive/2005/06/10/172063.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • belldandy11
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 09:00:329楼 得分:5
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • JL99000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 09:02:5810楼 得分:5

    SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
    begin tran 
    update A set 字段3=2
    --waitfor delay '00:00:10' --等待10秒 
    select * from A 
    rollback tran 


    SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
    update A set 字段3=1

    select * from A
    --
    使用事务的隔离级别,READ COMMITTED 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • viaivi
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 09:04:1311楼 得分:5
    最简单的办法,用一条空update锁定数据
    update 表 set id= id where id=1
    后面在写你要执行的SQL语句
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • amandag
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      5

    发表于:2008-05-12 09:25:4112楼 得分:5

    通用的解决策略有以下几种:

    锁定记录,当一个用户编辑一条记录时,其他用户只能读取记录,但不能更新这些记录,这叫做消极记录锁定(Pessimistic Record Locking)。如果包括很多用户,那么数据库很快会被全部锁定而无法使用。

    只更新您更改的列,这可能会导致数据库内部一致,而与实际情况完全不符。假设两个销售人员都检查同一本书的库存,NumberOnHand(目前拥有的数量)字段是1,他们把NumberOnHand字段都变成了0,这样会导致有一个用户拿不到书,因为,每一本书只能销售一次。为了防止这一点,只能锁住记录,然后读取数据,但此方案并发性很差。

    可以设置在更新之前,检查记录是否已经改变,并只对没有改变的记录做更新。不幸的是这仍然解决不了问题。如果在更新之前查看数据库,有可能在查看数据并且修改数据时,其他人已经更新了数据库。假设有足够的时间来处理事务,就可能发生数据冲突和破坏。因为每次更新数据,都需要访问两次数据库(先读后写),这并不是很有效率的方法。在一个高访问量的应用程序中,性能问题将是十分昂贵的。

    如果记录已经更改,用一种保证能够产生错误的更改方式,在错误发生时,处理这些(很少发生的)错误,这被称为优化并行(Optimistic Concurrency)。.NET已经实现了这个方法。
    为了实现优化并行,WHERE语句应该包含原始值(DataSet会自动存储),这样就可以保证,如果另一个用户修改了记录,则该记录不会被更新。因此,无须预读记录,就能够写(一次),并且如果已经修改了记录,那么不会更新数据。这种方法具有巨大的效率优势。在大多数情况中,更新是成功的,且不会被额外的数据库读取所打扰。如果更新成功,检查数据和更新之间不会存在滞后,这样其他人就不会有机会悄悄地另写一次。如果更新失败,则能够了解其中原因,并采取正确的行动。为了让这种方式工作起来,如果数据库中的数据在获得数据后改变,更新必须失败。因为数据源能够告诉您它从数据库获得的原始值。您只须将这些原始值作为参数传递给存储过程,然后,在Update语句的Where子句中添加它们即可。换言之,必须扩展Where语句来指出“每个列的值没有改变的记录”。当更新记录时,将检验原始值与数据库中的值。如果二者不同,那么只有在解决了由其他人与您之间更新记录的问题后,才可以更新记录。(简单地说,就是更新记录要保证所有字段的值与开始一致)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • youaskme
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 09:28:2313楼 得分:5
    bj
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • JL99000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 09:33:2714楼 得分:5
    最简单的办法就是写在将更新的操作写在事务中。
    begin tran
        update A set 字段3=11 where 字段1='bbb'
        waitfor delay '00:00:10'
        select * from A
    commit tran

    go

    begin tran
    update A set 字段3=33 where 字段1='bbb'
    select * from A
    commit tran


    select * from A
    --像这种的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhanglei5415
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 09:36:1515楼 得分:5
    时间戳
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • JL99000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 10:04:1116楼 得分:5
    楼主说的好象是这个意思:
    开始是2个用户显示了相同的数据,这时,用户1修改了数据,而这时用户2显示的还是用户1修改前的数据,而你要显示的是用户2修改后的数据,这样用户1就根据这个修改后的数据再决定是否修改。

    要是这样的话,肯定是做个定时刷新之类的东西,而且我觉得你这样想实现的不好做,做成时时的系统不是那么简单做到。
    数据库不能实现推的功能,只能由应用程序了来拉。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maco_wang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 11:01:5117楼 得分:5
    加锁就ok了,很常用的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zyciis800
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 12:11:0618楼 得分:0

    RE:这里说的不是SQL的问题
    这里说的是ASP.NET中
    多个用户同时浏览一个页面,而对页面的内容进行修改的问题
    [color=#FF0000]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lovehongyun
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 12:15:3419楼 得分:10
    引用 18 楼 zyciis800 的回复:

    RE:这里说的不是SQL的问题
    这里说的是ASP.NET中
    多个用户同时浏览一个页面,而对页面的内容进行修改的问题
    [color=#FF0000]


    用时间戳处理并发

    http://www.cnblogs.com/tintown/archive/2005/03/22/123404.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • JustLovePro
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 12:48:5520楼 得分:5
    学习。。。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved