当前位置:编程学习 > C#/ASP.NET >>

两个或多个用户操作一个订单问题。

两个用户打开同一订单号同时编辑内容。
A:打开订单编辑多项内容后点击保存,
B:打开的时候只编辑了一项内容。。

问题:因为AB用户同时打开页面,数据都为空,然而A比B先保存,B保存的只有一个字段,其他字段为空,覆盖了A输入多个字段,也就是说,A比B先保存,等于A输了半个小时的数据白忙活了,被B用户的空字段给覆盖了,

高手们,有遇到过这种问题的吗?请帮帮忙解决一下啊。很急!。。 数据 用户同时保存 asp.net --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 你在更新的时候开启ado的悲观并发
--------------------编程问答-------------------- 假如表A 有 a1,a2,a3三个字段
那么你更新的时候 就这么写更新语句:
update A set a1=xxx where a1=a1' and a2=a2' and a3=a3'
a1' a2' a3' 是旧的值 确保你在更改时表数据没有被更改过 --------------------编程问答--------------------
引用 3 楼 laiyongxin 的回复:
假如表A 有 a1,a2,a3三个字段
那么你更新的时候 就这么写更新语句:
update A set a1=xxx where a1=a1' and a2=a2' and a3=a3'
a1' a2' a3' 是旧的值 确保你在更改时表数据没有被更改过



我的页面有很多文本框啊。而且文本框不是固定的,还有动态添加行的文本信息, 不可能每次保存都去判断那么多文本框啊。 --------------------编程问答--------------------
引用 4 楼 u010072032 的回复:
Quote: 引用 3 楼 laiyongxin 的回复:

假如表A 有 a1,a2,a3三个字段
那么你更新的时候 就这么写更新语句:
update A set a1=xxx where a1=a1' and a2=a2' and a3=a3'
a1' a2' a3' 是旧的值 确保你在更改时表数据没有被更改过



我的页面有很多文本框啊。而且文本框不是固定的,还有动态添加行的文本信息, 不可能每次保存都去判断那么多文本框啊。

那你可以在表中加一个字段 保存一下操作时间(到毫秒级) 以后你就判断这个字段是否相等 也是可以的 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 同意#5楼。可以数据库里加一个时间字段,每次查询的时候取出存着,等到保存的时候再比较这个字段和数据库里当前的时间字段是否一致,不一致的话提醒用户,让他刷新之后再操作 --------------------编程问答-------------------- 在进行插入或者更新的时候,进行lock
首先你要搞清楚设计,你这种情况要靠设计来避免。 --------------------编程问答-------------------- 当有人编辑时,别人不能进入 --------------------编程问答-------------------- 给你的表添加时间戳字段,update的时候判断时间戳是否一致 --------------------编程问答-------------------- 添加时间戳,感觉也不是很好,对方好不容易输入了半天,然后告诉她要刷新后重新输入, --------------------编程问答-------------------- 页面判断 ,只修改 被更改过的内容。 --------------------编程问答-------------------- 请搜索乐观锁与悲观锁 --------------------编程问答-------------------- 高手在吗??? --------------------编程问答--------------------
引用 14 楼 u010072032 的回复:
高手在吗???


高手不在 --------------------编程问答-------------------- 其实上面2楼,5楼,7楼,8楼,10楼,13楼已经给出解决办法了, --------------------编程问答-------------------- 好东西,回复一下 --------------------编程问答-------------------- 加一个时间戳字段就可以解决问题,a保存数据的时候,时间戳肯定变了,然后当b用户保存数据时先判断时间戳有没有变,如果时间戳变了就说明此记录已被别的用户编辑过了,弹出框提示即可 --------------------编程问答-------------------- 这种情况跟锁就没半毛钱关系 --------------------编程问答-------------------- 我感觉这种情况一般只能有一个用户保存成功吧,如果想办法把两个都保存成功了,我想a,b用户再次打开时肯定都一头雾水 --------------------编程问答--------------------
引用 18 楼 blueskybcl 的回复:
加一个时间戳字段就可以解决问题,a保存数据的时候,时间戳肯定变了,然后当b用户保存数据时先判断时间戳有没有变,如果时间戳变了就说明此记录已被别的用户编辑过了,弹出框提示即可



感觉用时间戳不是很好,因为文本框有N多个啊。B用户输入完了保存不了肯定要埋怨死了。 --------------------编程问答-------------------- 编辑那个改那个,怎么会设计出没改值还要提交过去 --------------------编程问答-------------------- 数据库可以做数据合并吧 --------------------编程问答-------------------- 高手啊。。,大师啊。。。都出来看看,问题困扰我几天了。。 --------------------编程问答-------------------- 异步的问题,其实解决的办法挺多的 第一 这个订单被人打开的时候别人进入的时候提示此订单正在修改,这个可以用timer 解决 但是效率不怎么样。因为利用时间戳来进行判断。
第二 可以考虑用线程锁来进行。
其三可以对sql语句进行判断来进行操作 --------------------编程问答-------------------- 所有说保存时判断的方法都不靠谱。LZ的核心问题是为了避免重复劳动,保存时再判断就已经是晚了,时间成本已经付出了。

应该在某人进入时马上设置数据库该记录的标志位,下一个人进入时查看标志位,如果被占则出提示并退出,避免重复劳动。
但这样也有一个问题。就是先期进入的人迟迟不提交或中途关闭浏览器,导致标志位永远被占。这就要采取判断用户是否在线的策略了。而这种策略应该是整个系统框架的一部分。 --------------------编程问答-------------------- 这个确实和什么数据库并发一点关系都没有。
A和B完全可以是非并发的独立的操作 --------------------编程问答-------------------- 这个只能通过业务控制吧,同一时间只允许一个用户修改。
--------------------编程问答--------------------

--------------------编程问答-------------------- 高手指路啊。 --------------------编程问答-------------------- 用时间戳做出来了,但老板说这样不好。最好是AB用户的数据都可以保存。
还有其他方法吗?
高手们。。 --------------------编程问答-------------------- 楼主所说的问题在Nhibernate 的【更新】犹为明显。根据Nhibernate 的缺陷可做以下处理,能解决修改什么内容则只更新什么内容的问题。

前端:判断 控制值是否变化,有变化的才传递到后台,
比如: 姓名 、年龄、出生日期 只有出生日期 页面上的新旧值不同,此时传递 出生日期的字段 与值到后台。

后台构建 Sql脚本时可以只处理有变化的字段。如果其他用户类似并发的已经修改了其他值也不会有影响。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,