1, 现在业务中有一个问题 是 从仓库中 去 捡货问题,是一个ERP系统去拣货的时候要去数据库去 货架是不是有这个商品呢,有就可以继续,否则抛异常大概意思是这样,本系统是strut2+spring开发的,由于一次捡货是15个 订单,前台自动选择15,struts2 action处理,调用业务逻辑去数据库 跑一圈 一般都要 30-60秒如果我要做成多用户同时可以 去拣货 <比如有一个人在捡15的时候,其他用户操作时如果再操作这15个就报错,或者说再去捡其他的没有 拣的订单>我的初步考虑是在strut2的action加同步锁,但是这样效率估计 不会高,请问大家有什么高见啊还有一个问题是 订单可能对应的仓库是不同商品,所以可以针对不同商品枷锁,是否效率高些呢?
action枷锁是不可取的
1. 用行锁锁定你读取出来的记录
select xxx, yyy, zz from tablea for update2. 在数据库里面增加一个捡货的状态,和捡货的时间,读取出来的时候给置上
然后用quartz做一个线程,将超过一定时间还没有捡货的数据将其捡货状态设置成未捡货
2的话. 我刚刚也在想不过会加大操作数据库的次数.搞不好.时间会更久.可不可以加个static变量来存被操作的序号呢? 这样仅仅是做if而已.
最大限度影响速度的 可能就是 刚巧N个用户来捡货 所有的货物都被捡掉了 第N+1个用户来 查询 这次的查询是速度影响最大的...就相当于对原先货物的表来个select * 可是就一个标识的字段能有多慢呢
当然..如果用户量非常少的时候.我这个方案就是垃圾方案了. 尴尬的说.嘿嘿
1.创建一个表,用于记录用户选择的数据。假设为表X
2.用户查询数据时,要过滤掉在表X中的数据。
3.用户在选择确认数据时,都要判断该数据是否在表X中。如存在则不允许选择。
4.用户选择后,需要将选择的记录写入表X中。
5.用户选择后如放弃(或者关闭当前窗口),需要在关闭事件中处理,删除表X中相应的记录。
6.由于异常,断电等情况,无法保证表X没有垃圾,因此还可能需要定时清理。
A在捡货过程中table 表中A在捡货的商品存在 这个时候B也要捡这个商品就会被告知这个商品在捡货中 稍等.....可以让他等待1分钟再次尝试......这个取决你A用户的执行效率....当A执行完毕后会删除表中A捡货的商品不至于 会跟别的用户起冲突....
存储过程保证事务,锁表保证对表的访问(or 行级锁时,相关行的访问)是线性的,相当于你的java的sync。
在sqlmap写select for update也不知道 支持不 明天 测试下
各位 有 遇到 这个问题的 说说啊 谢谢先。
内容太长,贴个链接,楼主自己去看看,希望能解决你的问题如何并发每次取前100条不同记录:
http://blog.csdn.net/zhaohuihua/archive/2010/05/24/5619076.aspx具体到你这个问题,为避免出现:
订单被某用户拣了却没有处理,则该订单将永远无法被其他用户处理了
标志字段应设置为时间类型,如[HandleTime]
假定10分钟超时,则取记录只取[HandleTime]在10分钟以前的记录
用户提交订单,应判断[HandleTime]在10分钟以内,否则提示超时失败
而且,不能按先后顺序取记录,只是保证每次取的记录不同
其次,若实现报错功能,可在相关记录的表中,添加检货状态字段。通过该字段进行校验报错。只针对记录加锁,貌似无法实现报错功能。
第三,如果整个检货过程所形成的数据库事物的隔离级别很高的话,坚决赞同使用悲观锁。
第四,由于数据库查询耗时很长,所以,通常要想办法限定同时检货的人数。同时检货的人越多,大家等待的时间会指数倍的增加,而且还会影响其他也没的访问。
第五,一般不考虑在Struts2的Action上面添加同步锁,绝大多数问题,都能在数据库层,逻辑层解决。以上意见仅供参考。