我认为有两种方法,一种就是在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保存就会出现并发冲突的错误。
更新时候与数据的"updateDateTime"比较,一致的话,则可以更新,并且同时更新该字段"updateDateTime",
否则,提示错误。
UPDATE table SET filed = value,…… WHERE updateDateTime = '保存在页面的更新时间';
返回影响记录数>=1,则更新成功;
返回0,则更新失败;
当然这样做的缺点是,会使其他用户填写的信息丢失
或者和数据库中上一次更新时间比较,如果时间戳早于它,则不允许更新.
只是B用户在修改数据后过一段时间发现有人改掉它的内容了而已,这里只要记录操作人即可。
而且为了解决这个无关紧要的问题,或者说很多时候这就不是个问题,而用数据库锁或者服务器推反而不好,数据库锁所带来的问题就是会大大降低程序运行效率,甚至还要考虑到死锁等各种附加带来的问题,而服务器推技术,说句实话,http协议在这个方面是在是不好办,可能我孤陋寡闻,我现在是找不出有什么办法来解决这个问题,除了安装富客户端来开启一个专用传输通道外(不要说死循环不断检测,那不是推)。
如果A在修改过程先被B修改,A保存就会出现并发冲突的错误。
期待LZ 说明确点