不知各位在进行WEB信息开发有没有处理过这样问题。有两个用户A 、BA从数据库中读取一条记录要更新,当读取到显示在一个WEB 页面,用户A 会长时间没有提交更新。而B用户会在A读取后没有提交更新 读取在条记录,又比A 提前提交。就是说之后A的修改不是按当之前的内容修改了。什么进行这方面的控制。??,因为WEB 系统不能用 SELECT .... FROM...FOR UPDATA 这种读取方式。 

解决方案 »

  1.   

    设置一个更新字段,如:"updateDateTime",页面读取记录则可把该字段隐藏在页面;
    更新时候与数据的"updateDateTime"比较,一致的话,则可以更新,并且同时更新该字段"updateDateTime",
    否则,提示错误。
      

  2.   

    例如:
    UPDATE table SET filed = value,…… WHERE updateDateTime = '保存在页面的更新时间';
    返回影响记录数>=1,则更新成功;
    返回0,则更新失败;
      

  3.   

    使用服务器推送技术,当几个用户都在更改的时候,只要有一个提交了,那么就通知所有的其他用户对页面进行reload.加载最新数据,
    当然这样做的缺点是,会使其他用户填写的信息丢失
      

  4.   

    在修改页面加个时间戳,如果时间戳时间与当前时间差距过大,则不接收提交.实际 session.timeout 也可以.
    或者和数据库中上一次更新时间比较,如果时间戳早于它,则不允许更新.
      

  5.   

    这好像是无关紧要的吧,对于A用户自己而言,他修改的信息前后是明确的,对于B用户而言,修改的信息也是前后明确的,如果他们做出修改的话。
    只是B用户在修改数据后过一段时间发现有人改掉它的内容了而已,这里只要记录操作人即可。
    而且为了解决这个无关紧要的问题,或者说很多时候这就不是个问题,而用数据库锁或者服务器推反而不好,数据库锁所带来的问题就是会大大降低程序运行效率,甚至还要考虑到死锁等各种附加带来的问题,而服务器推技术,说句实话,http协议在这个方面是在是不好办,可能我孤陋寡闻,我现在是找不出有什么办法来解决这个问题,除了安装富客户端来开启一个专用传输通道外(不要说死循环不断检测,那不是推)。
      

  6.   

    我认为有两种方法,一种就是在A读取之后加上锁标志,B读取后就告诉B这条记录正在被别人修改中,不允许B修改。只有在A保存修改后解除锁标志,但是必须做好A非正常推出系统或者离开页面的问题。另外一种方法,就是在update 语句的where后面字段和他读取时的字段比较,例如:UPDATE LANE_PERFORATION_Drawing SET DrawingNo = @DrawingNo, DrawingName = @DrawingName, DrawingSt = @DrawingSt, UpLoadTime = @UpLoadTime, Designer = @Designer, Promulgator = @Promulgator, ID = @ID, Type = @Type WHERE (DrawingNo = @Original_DrawingNo) AND (Designer = @Original_Designer OR @Original_Designer IS NULL AND Designer IS NULL) AND (DrawingName = @Original_DrawingName OR @Original_DrawingName IS NULL AND DrawingName IS NULL) AND (DrawingSt = @Original_DrawingSt OR @Original_DrawingSt IS NULL AND DrawingSt IS NULL) AND (ID = @Original_ID) AND (Promulgator = @Original_Promulgator OR @Original_Promulgator IS NULL AND Promulgator IS NULL) AND (Type = @Original_Type) AND (UpLoadTime = @Original_UpLoadTime OR @Original_UpLoadTime IS NULL AND UpLoadTime IS NULL)
    如果A在修改过程先被B修改,A保存就会出现并发冲突的错误。
      

  7.   

       不知道,LZ说的是要修改什么信息,好像在web中,用户只能浏览或者是查询信息,修改的话,只能修改自己的个人信息吧。
       期待LZ 说明确点
      

  8.   

    可以以要更新字段内容为条件,比如你要更新student表中的student_name字段,你查询到当前的student_name为yosuuf,你就可以在更新SQL中加入条件update * where student_name = 'yousuf';如果是因为B先提交而造成A更新数据库失败,则A刷新一下页面就知道有人已经更新过student_name字段.