`
悲剧了
  • 浏览: 144323 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多人操作数据的处理策略--讨论

阅读更多
用户故事如下:

电子商务后台管理,有多个客服人员可以操作同一个数据,当有的人正在对他进行修改的时候,其他人却觉得这个数据是垃圾数据,就直接删除了

如果是你,你在项目中如何处理这一小细节。

比如:当你载入订单修改的适合,有人已经把订单删除了,你去保存,不会有任何错误,反而操作成功

可以去数据库更新一个id不存在的字段,没有任何问题,只会
update  qqinfo set name='fdfd
' where id=90;

Query OK, 0 rows affected
Rows matched: 0  Changed: 0  Warnings: 0


我们目前策略如下:

对订单管理,很多工作人员都可以载入订单

特殊处理这个操作数据库的方法,设置一个字段--是否可用

可用才执行操作,操作的适合先把这个字段设为不可用

欢迎大家提出好的想法


----------------

非常谢谢大家的回复,第六页的 不知云 给出了很好的解决策略 大家可以看看

这贴就结了吧
分享到:
评论
36 楼 nick.s.ni 2011-05-25  
railway 写道
yangyi 写道
railway 写道
yangyi 写道
railway 写道
rocketball 写道
szcs10138456 写道
小盆友们不用争了,先查询,加上乐观锁不就OK了。

这压根不是这个问题,主要是考虑后台操作人员工作重复,人家是通过这个统计工作量的


看到任务列表后,先把某笔任务申请下来(数据库表中记录申请人信息,便于统计工作量),申请成功则开始做该任务,如果不想做该任务,则可以释放,让别人去做。

这个是排它锁,和synchronized一样


这跟排它锁没什么关系,synchronized需要排队,而申请数据是将共用的数据申请为私有的数据,申请成功再进行操作,比如修改花了半个小时(由于是私有数据,别人无法操作,就不怕别人删除);
修改数据或删除数据时,带有自己的用户信息(SQL的where条件中加入用户信息)。


就锁的本质效用而言是一样的,都需要排队访问临界区。唯一的区别可能就是是否block



我觉得楼主的困境应该在于两点:

1、B操作的数据可能被其他人操作了(甚至删除了)
    此时的解决方法是使用乐观锁,可以使用时间戳或者UUID。

2、工作量统计问题
   比如,A、B两人同时去操作同一数据(假设是填写复杂的表单),A花了30分钟去修改,B看了数据后,觉得没用,花了20秒钟的时间删除了它,因为B先提交,所以提交成功了(删除成功),而A不知道,还在那里卖力地填写,等到A提交的时候,提交失败,受影响的记录为0(Query OK, 0 rows affected),数据未保存。
  对于A来说,浪费了30分钟的时间去做“无意义”的事(结果未提交成功),如果要统计工作量的话,A这笔业务是无效的,如果一天下来,A倒霉地碰到了很多这样的情况,那要抓狂了,当然这不是A的原因,是系统设计的问题。

还有你的是删除的人权限大,还是修改的人权限大,如果是修改的权限大,那在修改的时候不能删除,反过来就是修改的时候可以删除。

如果是电子商务后台,订单肯定不会真的删除,应该只会修改某个字段进行判断。要有操作人员的记录。

还有就是实际情况,麻烦的是修改的时候可以删除,那删除的之后如何能及时通知前台还在修改的人员,B/S目前可以用
异步轮询,C/S 可以用JMS之类异步通信。
35 楼 skycray 2011-05-25  
Pessimistic Locking & Optimistic Locking..
但Optimistic可能不大复合LZ的情况...用Optimistic是意味着第二个修改的人会TransactionRollback
34 楼 spell 2011-05-25  
唉,这个是糟糕的设计导致的问题,有一些东西做出来是给一个人用的,不是大家可以一起用的。包括现在的很多商城,其实都有楼主所说的这个问题。

我的解决办法是,谁要处理特定的任务,先申领这条任务,每个人只可以处理自己申领或者主管分配给自己的任务,那不就OK了吗?从业务上彻底解决这个问题。表结构方面,增加user_id,处理情况等。刚开始user_id为空,分配给谁,这个user_id就记谁的,处理的时候先判断任务的user_id是不是目前登录的这个人,不是的话,不给处理。其实这个跟工作流的整合很有关系。
33 楼 TheMarine 2011-05-25  
如果一个系统的某资源对于a很重要,对于b不重要并且可以随意删除的话,这设计是何等的狗屎。a不会杀了b吧?另外删除的时候不要真删除,修改开关字段不就ok了?
32 楼 lovit 2011-05-25  
goooooon 写道
update时候判断sql%rowcount,更新不为1,就抛错误,保证数据一致,ok了

正解
31 楼 obullxl 2011-05-25  
对于特别敏感的数据,建议使用存储过程加乐观锁。
30 楼 lgsun592 2011-05-25  
如果你早一周提出此问题,那我上周五的面试通过的几率会大大的增加的,哎
29 楼 zjrstar 2011-05-25  
删除数据有点危险,应该设置数据的状态标志。如果某个工作人员觉得数据无用,可以给这行数据设置删除标志。这样下去库里面的数据量可能会增大。解决方案是定期删除库中设置了删除标志的数据。还有就是这种情况一定要采用乐观锁。更新的时候要检查数据的状态是否容许更新。
28 楼 xly_971223 2011-05-25  
加个乐观锁字段就ok了吧
27 楼 railway 2011-05-25  
yangyi 写道
railway 写道
yangyi 写道
railway 写道
rocketball 写道
szcs10138456 写道
小盆友们不用争了,先查询,加上乐观锁不就OK了。

这压根不是这个问题,主要是考虑后台操作人员工作重复,人家是通过这个统计工作量的


看到任务列表后,先把某笔任务申请下来(数据库表中记录申请人信息,便于统计工作量),申请成功则开始做该任务,如果不想做该任务,则可以释放,让别人去做。

这个是排它锁,和synchronized一样


这跟排它锁没什么关系,synchronized需要排队,而申请数据是将共用的数据申请为私有的数据,申请成功再进行操作,比如修改花了半个小时(由于是私有数据,别人无法操作,就不怕别人删除);
修改数据或删除数据时,带有自己的用户信息(SQL的where条件中加入用户信息)。


就锁的本质效用而言是一样的,都需要排队访问临界区。唯一的区别可能就是是否block



我觉得楼主的困境应该在于两点:

1、B操作的数据可能被其他人操作了(甚至删除了)
    此时的解决方法是使用乐观锁,可以使用时间戳或者UUID。

2、工作量统计问题
   比如,A、B两人同时去操作同一数据(假设是填写复杂的表单),A花了30分钟去修改,B看了数据后,觉得没用,花了20秒钟的时间删除了它,因为B先提交,所以提交成功了(删除成功),而A不知道,还在那里卖力地填写,等到A提交的时候,提交失败,受影响的记录为0(Query OK, 0 rows affected),数据未保存。
  对于A来说,浪费了30分钟的时间去做“无意义”的事(结果未提交成功),如果要统计工作量的话,A这笔业务是无效的,如果一天下来,A倒霉地碰到了很多这样的情况,那要抓狂了,当然这不是A的原因,是系统设计的问题。
26 楼 yonghong915 2011-05-25  
正遇到这个问题,也在思考这个问题,如果并发量比较大怎么做呢?
25 楼 wuxianjun 2011-05-25  
1,数据库本身事务看你的事务策略。
2,业务事务,也就是订单在某个状态下有什么操作。如:订单删除只有取消未发货才能删除.多人同时载入的时候肯定只有一个人能操作成功,其他的抛业务异常就可以了。
删除时候,可以做逻辑删除。
3,并发操作可以加锁,如:悲观锁,乐观锁。
24 楼 songlixiao 2011-05-25  
1. 数据库表增加一个时间戳字段。
2. 查询显示数据时,将世界戳字段查询出,并带到表单中。
3. 表单修改提交后,时间戳字段一同提交,保存前校验此数据时间戳是否与数据库一致,不一致说明已经被别人修改,不允许执行操作。
4. 如果时间戳一致,将数据的时间戳赋予当前时间,并保存到数据库。

原则是所有人都可以查询,但是修改则只有在最后一个版本上修改的才算有效。
23 楼 kingkan 2011-05-25  
用时间戳,还要设置多久没提交该时间戳失效。
22 楼 goooooon 2011-05-24  
update时候判断sql%rowcount,更新不为1,就抛错误,保证数据一致,ok了
21 楼 yangyi 2011-05-24  
railway 写道
yangyi 写道
railway 写道
rocketball 写道
szcs10138456 写道
小盆友们不用争了,先查询,加上乐观锁不就OK了。

这压根不是这个问题,主要是考虑后台操作人员工作重复,人家是通过这个统计工作量的


看到任务列表后,先把某笔任务申请下来(数据库表中记录申请人信息,便于统计工作量),申请成功则开始做该任务,如果不想做该任务,则可以释放,让别人去做。

这个是排它锁,和synchronized一样


这跟排它锁没什么关系,synchronized需要排队,而申请数据是将共用的数据申请为私有的数据,申请成功再进行操作,比如修改花了半个小时(由于是私有数据,别人无法操作,就不怕别人删除);
修改数据或删除数据时,带有自己的用户信息(SQL的where条件中加入用户信息)。


就锁的本质效用而言是一样的,都需要排队访问临界区。唯一的区别可能就是是否block
20 楼 railway 2011-05-24  
yangyi 写道
railway 写道
rocketball 写道
szcs10138456 写道
小盆友们不用争了,先查询,加上乐观锁不就OK了。

这压根不是这个问题,主要是考虑后台操作人员工作重复,人家是通过这个统计工作量的


看到任务列表后,先把某笔任务申请下来(数据库表中记录申请人信息,便于统计工作量),申请成功则开始做该任务,如果不想做该任务,则可以释放,让别人去做。

这个是排它锁,和synchronized一样


这跟排它锁没什么关系,synchronized需要排队,而申请数据是将共用的数据申请为私有的数据,申请成功再进行操作,比如修改花了半个小时(由于是私有数据,别人无法操作,就不怕别人删除);
修改数据或删除数据时,带有自己的用户信息(SQL的where条件中加入用户信息)。
19 楼 yangyi 2011-05-24  
railway 写道
rocketball 写道
szcs10138456 写道
小盆友们不用争了,先查询,加上乐观锁不就OK了。

这压根不是这个问题,主要是考虑后台操作人员工作重复,人家是通过这个统计工作量的


看到任务列表后,先把某笔任务申请下来(数据库表中记录申请人信息,便于统计工作量),申请成功则开始做该任务,如果不想做该任务,则可以释放,让别人去做。

这个是排它锁,和synchronized一样
18 楼 yangyi 2011-05-24  
乐观锁,和ArrayList里面的ConcurrentModificationCount一样
17 楼 railway 2011-05-24  
rocketball 写道
szcs10138456 写道
小盆友们不用争了,先查询,加上乐观锁不就OK了。

这压根不是这个问题,主要是考虑后台操作人员工作重复,人家是通过这个统计工作量的


由于多人操作数据,数据是共用的,所以设立一个机制,做某笔数据前,先申请,申请成功再开始操作(修改、删除)。

看到数据列表后,先把某笔数据申请下来(数据库表中记录申请人信息,便于统计工作量),申请成功则开始做该任务,如果不想做该数据,则可以释放,让别人去做。

ps.如果要统计工作量,删除应该是逻辑删除。

相关推荐

    网络多人游戏架构与编程Multiplayer Game Programming-Architecting Networked Game.pdf

    3. **服务器架构**:多人游戏通常采用客户端-服务器架构,书中会讨论单服务器、多服务器、分布式服务器等模式,以及负载均衡、故障转移和扩展性的实现方法。 4. **游戏逻辑与状态管理**:处理玩家行为和游戏世界的...

    大型多人在线游戏设计

    通过上述讨论,我们可以看出大型多人在线游戏设计中的持久化策略是一个复杂但至关重要的领域。正确的策略不仅可以保护玩家的数据不被丢失,还能提高游戏的整体性能,为玩家创造更加流畅和丰富的游戏体验。

    多人聊天软件

    4. **语音与视频通话**:多人聊天软件往往集成语音和视频通话功能,这需要高质量的音频编码/解码技术(如Opus或AAC)和视频编码/解码技术(如H.264或VP9),以及网络适应策略来处理不同网络条件下的流畅通信。...

    大型多人在线游戏开发,大型多人在线游戏开发 pdf,C,C++

    开发者需要考虑服务器的分布式部署、负载均衡、数据同步策略(如时间切片、延迟同步等)以及如何处理玩家间的交互。 3. **客户端与服务器通信**:游戏客户端和服务器之间的通信协议是关键,通常使用TCP/IP协议栈,...

    网络多人游戏架构与编程.pdf&源码

    2. **同步机制**:介绍各种同步策略,如锁步同步、基于状态机的同步、时间戳同步等,以及它们在处理玩家操作延迟和网络抖动中的应用。 3. **服务器架构**:讨论不同类型的服务器架构,如主从服务器模型、P2P(对等...

    电信设备-多人使用的个人信息系统.zip

    此外,资料可能还讨论了故障恢复和灾难备份方案,以确保即使在系统故障或自然灾害情况下,用户的个人数据也能得到保护。这通常需要定期备份和冗余存储策略。 最后,安全性更新和维护策略不容忽视。面对不断演变的...

    基于Unity3D的网络多人对战策略游戏的开发与实.doc

    本文主要讨论了使用 Unity3D 开发基于网络的多人策略放置类型游戏的实际开发过程,涵盖了游戏客户端和服务端的开发、网络连接和信息交流的原理与方法、游戏热更新和游戏打包与功能测试等方面的知识点。 一、游戏...

    网络游戏-单向网络中进行数据广播的方法.zip

    通过理解网络特性和选择合适的通信协议,配合高效的数据处理策略和优化技术,可以在保证游戏体验的同时,有效管理网络资源。对于开发者来说,不断探索和实践,才能在单向网络环境中实现最佳的数据广播效果。

    多人在线聊天系统源码 xmpp+openfire

    在设计上,需要考虑用户体验,如消息的实时性、数据同步以及离线消息的处理。 **私聊和建房分组聊:** 在多人聊天系统中,私聊是指两个用户之间的个人对话,而建房分组聊则涉及创建一个聊天室,允许多个人参与讨论...

    网络游戏-具有光纤网络功能的数据处理装置.zip

    在多人在线游戏中,大量的用户同时交互,需要快速交换大量数据,光纤网络能有效降低延迟,使得游戏过程更加流畅,提高玩家的沉浸感。 数据处理装置是网络游戏系统的核心部分,它负责接收、处理和发送游戏数据。具备...

    asp.net 长连接的聊天室(多人房间)

    ASP.NET长连接的聊天室是一种实现高实时性的在线交流平台,尤其适合于多人参与的讨论环境。这种聊天室的核心技术是Comet,一种用于创建服务器推送(Server-Sent Events)的编程模型,允许服务器主动向客户端发送数据...

    毕业设计(论文)-基于JAVA的多人聊天室设计.doc

    4.3 安全性实现:介绍加密算法和安全策略,确保用户数据的安全传输和存储。 第 5 章 系统测试与优化 5.1 测试方法:列出系统测试的主要步骤,包括功能测试、性能测试、安全性测试等。 5.2 问题发现与解决:分析...

    电信设备-基于无线通信传输技术的VR多人互动系统.zip

    同时,可能会涵盖如何处理多人互动时的数据同步和网络协调问题。 【标签】为“资料”,意味着包含的文件可能是研究报告、技术文档、教程或案例分析,提供关于该主题的深入信息。 【压缩包子文件的文件名称列表】中...

    ASP.NET做的多人聊天室,无刷新

    在这个场景中,我们讨论的是一个使用ASP.NET技术实现的多人聊天室,它利用了Ajax(Asynchronous JavaScript and XML)技术来实现页面无刷新通信,提高了用户体验。在传统的Web应用中,每次用户交互都可能导致整个...

    LINQ 数据的更新,插入、删除、批量更新

    本篇文章将详细探讨如何使用LINQ进行数据的更新、插入、删除以及批量更新操作,并特别关注在多人同时修改同一条数据时如何处理冲突,以及如何通过错误处理策略来确保更新的连续性。 首先,我们来看如何使用LINQ进行...

    搭建浏览器多人测试平台并进行nagios监控

    标题 "搭建浏览器多人测试平台并进行nagios监控" 暗示了本文将讨论如何构建一个支持多用户同时测试的浏览器环境,并结合Nagios系统进行监控,以确保服务的稳定性和可用性。Nagios是一款开源的网络监控系统,能够实时...

    网络游戏-基于云网络的多人互动学习方法及系统.zip

    《网络游戏-基于云网络的多人互动学习方法及系统》是一个深度探讨如何利用现代技术改进教育方式的专题。在这个数字化时代,网络游戏与云网络的结合为教育领域带来了革命性的变革,尤其是对于多人互动学习方面。本...

    数据开发基础知识点-1.docx

    本篇主要讨论了三种不同的数据提交模式:主键提交(upWhereKeyOnly)、主键加改变字段提交(upWhereChanged)以及主键加数据集其他字段提交(upWhereAll)。这些模式在Query和DSP组件的updateMode属性中进行设置,每...

Global site tag (gtag.js) - Google Analytics