Office中国论坛/Access中国论坛

标题: 请教如何处理进销存中的并发问题 [打印本页]

作者: lshstruc    时间: 2016-7-6 18:22
标题: 请教如何处理进销存中的并发问题
本帖最后由 lshstruc 于 2016-7-7 09:28 编辑

进销存,多人同时操作软件同时出库,如何解决:

1.当前发料人查询得到的某物资编码的当前库存在发料过程中被其他发料人更新,实际最新库存已不足,但当前发料人无法得到通知。

用锁是解决不了问题的,因为我是先查询库存,再根据库存批次生成出库单明细,几十条明细全部生成完毕后,点击保存后才保存出库单,更新库存。
用锁只能解决某一条明细生成过程中,该明细对应的物资编码的库存信息独占,一旦该品种发放完毕,该锁就会解除,而此时出库单还没有保存,实际库存还没有得到更新,其他人查询到的还是原始库存。

比方说:甲和乙同时发料,查询到物资A库存10,甲出库10,未保存,乙也出库10,先保存了,实际库存为0,甲不知道。

我目前的办法是:出库单保存时,本地事务处理,对出库单的明细项目逐条验证库存,只要有一条项目的库存被更新,导致库存不足时,事务回滚并提示被更新的项目。

但是可能存在的情况是,在逐条验证的过程中(条目较多的情况下),已验证过的库存被其他人更新,虽然这种几率比较小。
因此需要对事务队列,一次只能有一个人执行验证和保存的过程,其他人都要等待,只能服务器隔离事务处理?

有没有更好的办法?

作者: lshstruc    时间: 2016-7-7 09:29
没人回答
是不是我没把问题说清楚
作者: 风中漫步    时间: 2016-7-7 12:27
不知用的什么数据库

可以在保存时先锁住库存表,然后查询库存,更新,解锁.速度很快,应该不会影响其他用户
作者: 风中漫步    时间: 2016-7-7 12:29
你对锁挺有体会的,帮我看看这个
http://www.office-cn.net/thread-121922-1-1.html
作者: xinrenq    时间: 2016-7-7 18:28
首先,如果是ACCESS数据库来说,本身是文件式数据库,所以数据库自身,是没法解决这问题的,
所以要用到代码,一般用的是ADO事务,这可以,但从来不建议使用,因为出错后,麻烦就一大堆,

如果MSSQL,MYSQL这类的是数据服务,本身有事务队列进行处理,只要加上事务锁,就能解决这类问题

所以要解决的话,就不要用ACCESS,


作者: lshstruc    时间: 2016-7-10 09:11
本帖最后由 lshstruc 于 2016-7-10 09:41 编辑

vs2012+mssql2012,
现在的办法就是保存前逐项检验,并且调用服务器事务才能保存,一个人保存时,其他人排队,一旦前面保存的人将库存消耗完毕,后面的人将无法保存成功。
(因为我的出库单里的出库明细是先逐项生成,后集中一次保存的,有点像本论坛里面的主子窗体保存,在生成到保存这段时间里,是不可能锁定某一个表的)
我解决这个问题的思路是借鉴了淘宝网秒杀时高并发出库的解决办法,想象一下,大量用户秒杀同一宝贝时,如果不解决并发问题,淘宝就亏死了,库存就会变成负数。


作者: lshstruc    时间: 2016-7-10 10:10
风中漫步 发表于 2016-7-7 12:29
你对锁挺有体会的,帮我看看这个
http://www.office-cn.net/thread-121922-1-1.html

http://bbs.csdn.net/topics/350143041
作者: 风中漫步    时间: 2016-7-10 14:40
lshstruc 发表于 2016-7-10 09:11
vs2012+mssql2012,
现在的办法就是保存前逐项检验,并且调用服务器事务才能保存,一个人保存时,其他人排 ...

可能门派不同,我不知道我们说的是否是一个事情

只要都达到目的就行了




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3