Asp.net项目数据更新并发控制如何实现

wxhysoftsodc 2011-03-23 12:15:14
项目情况:
Web 项目,使用了PLinq(本质上跟Linq to sql )差不多。系统架构采用MVP架构。

问题:
由于在数据保存的时候都是根据数据ID去取最新的数据,然后再修改这个数据,最后提交更新。这样就导致了这样的情况发生,如果客户A和客户B都读取 数据 Data,然后在页面上做了修改。客户A先保存数据AData,然后客户B也保存了数据BData。由于客户B保存数据的时候,程序是先去了一下最新数据,所以获取到得数据是客户A保存的AData,因此最后保存的数据是在客户A的数据基础上的修改。这就导致了客户A保存的AData被覆盖。
现在希望,如果有多个人对同一个记录进行修改。那么在第一个人修改成功以后,后面的人提交的时候,系统能够发现记录已经被修改,提示用户他要修改的数据已经被修改了。避免第一个人的记录被其他人覆盖。
尝试过的解决方案:
1. Linq to sql 本身提供了并发冲突的机制,实验了一下,发现不怎么适合在web项目里面使用。
2. 使用时间戳的方法,这样需要在viewstate或Session里面保存每个对象的时间戳。在页面里有多个对象的需要更新时候,这种方案会变得非常复杂。

对应以上说的问题,不知道哪位有比较好的方案和经验。谢谢!
...全文
274 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxhysoftsodc 2011-03-24
  • 打赏
  • 举报
回复
没有更好的方案了吗?
小童 2011-03-23
  • 打赏
  • 举报
回复
每个人读取的时候把当前的时间保存起来(可以在页面放个隐藏域),

在用户修改的时候把修改时间存在数据库里,

用户B保存的时候判断这条记录的最后修改时间和隐藏域里面的时间比较,

判断是否允许修改,
小童 2011-03-23
  • 打赏
  • 举报
回复
每个人读取的时候把当前的时间保存起来,在用户修改的时候把修改时间存在数据库里,用户B保存的时候判断这条记录和读取时的时间比较,判断是否允许修改,
wxhysoftsodc 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 showenxxx 的回复:]

表里总是记录最后一次更新的时间

你要往表里写值的时候,如果当前的时间比最后一次更新的时间还要早,说明有人已经更新了,那么就要重新读取数据,提示用户数据已被别人更新。
[/Quote]
处理逻辑是这样,但是解决方案呢?
showenxxx 2011-03-23
  • 打赏
  • 举报
回复
表里总是记录最后一次更新的时间

你要往表里写值的时候,如果当前的时间比最后一次更新的时间还要早,说明有人已经更新了,那么就要重新读取数据,提示用户数据已被别人更新。
wxhysoftsodc 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 amandag 的回复:]

在自己做的一套内部系统中,界面上会对用户做一定提示,

比如:当前正在操作该记录的用户:【aa,bb】

用户点击提交或者退出此页面时修改为 当前正在操作该记录的用户:【aa】
[/Quote]
暂时还是希望能够从充分利用Linq to sql 并发控制的机制来处理。
amandag 2011-03-23
  • 打赏
  • 举报
回复
在自己做的一套内部系统中,界面上会对用户做一定提示,

比如:当前正在操作该记录的用户:【aa,bb】

用户点击提交或者退出此页面时修改为 当前正在操作该记录的用户:【aa】


wxhysoftsodc 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 amandag 的回复:]

如果在表里加1个时间戳字段,每次更新时比较时间戳是否与上次相同
[/Quote]

我的第二个方案就是这样。但是这样需要在客户端保存每条记录的时间戳。对于复杂对象的更新就很麻烦了。
wxhysoftsodc 2011-03-23
  • 打赏
  • 举报
回复
To 4楼
时间戳是可以,但是如果有多个对象或者不同类型的对象需要更新,那么客户端要保存多个时间戳,这样实现起来就非常复杂了。

你的第二套方案,我也考虑过。这样的话就需要有个操作或者服务去修改IsOrNoUpdate这个字段。否则,以后就没法更新这条记录了。暂时还不可考虑这样的方案。

不知道有没有人在web项目中使用Linq to sql ,同时解决了并发控制的问题。
amandag 2011-03-23
  • 打赏
  • 举报
回复
如果在表里加1个时间戳字段,每次更新时比较时间戳是否与上次相同
  • 打赏
  • 举报
回复
使用state状态,如果已经登录,则把state改为1(1为登录,0为下线),当用户没退出的时候,如果用户在另外一台电脑上登录,提示,您已经登录,这样就无法登录,那么当用户A修改信息的时候,用户B是不可能修改的,除非A退出!
子夜__ 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wxhysoftsodc 的回复:]

谢谢2楼,你的方案跟我的第2套方案很像。这种方案对于要修改多个不同类型对象的情况下就很麻烦了。
[/Quote]
时间戳可以啊。

或者在加入UpdateID UpdateTime IsUpdate类似这样的字段

用户A更新的时候吧IsorNoUpdate字段更新成1

此时B更新的时候 读取字段如果为1那么久就提示。。

更新完毕再把IsorNoUpdate更新成0

wxhysoftsodc 2011-03-23
  • 打赏
  • 举报
回复
谢谢2楼,你的方案跟我的第2套方案很像。这种方案对于要修改多个不同类型对象的情况下就很麻烦了。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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