以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]存储过程 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=81636) |
-- 作者:huhu -- 发布时间:2016/3/2 15:18:00 -- [求助]存储过程 If e.DataCol.name = "SN" Then If e.DataRow("体态") = "通用态" Then Dim dr1 As DataRow = DataTables("库存通用态表").Find("物料编码 = \'" & e.DataRow("物料编码") & "\'") If dr1 IsNot Nothing Then dr1("库存数量") = dr1("库存数量") + 1 dr1("可用数量") = dr1("可用数量") + 1 Else Dim dr2 As DataRow = DataTables("库存通用态表").AddNew dr2("物料编码") = e.DataRow("物料编码") dr2("物料名称") = e.DataRow("物料名称") dr2("库位类别") = e.DataRow("库位类别") dr2("体态") = e.DataRow("体态") dr2("库存数量") = 1 dr2("可用数量") = 1 End If 这段代码我同事说有潜在的风险。(如果多任务并发进行) 比如这句dr1("可用数量") = dr1("可用数量") + 1 当设备SN进来,第一次读可用数量,读出来是100,这时还没进行加1和赋值的动作。恰巧另外一个客户端把可用数量给改为了80.这时我去加1,然后赋值。是在读出来100的基础上加1然后赋值的,最后可用数量变为了101了。而非81了。 如何避免这种情况。 是用存储过来来实现吗?怎么弄?
|
-- 作者:大红袍 -- 发布时间:2016/3/2 16:17:00 -- 修改后,要立马保存。然后要用sqlfind查找后台最新的数据
Dim dr1 As DataRow = DataTables("库存通用态表").sqlFind("物料编码 = \'" & e.DataRow("物料编码") & "\'") |
-- 作者:huhu -- 发布时间:2016/3/2 16:31:00 -- 应该不是这样。 你说的如果是单线程那应该没问题。如果是多线程,并发操作呢。 就是我说的意思。第一个client在5秒时读到的可用数量是100,这时第二个client把后台的可用数量改为了80. 可是第一个人并不知道有人改了可用数量,仍然按照读到的100执行这条语句dr1("可用数量") = dr1("可用数量") + 1,那么可用数量变为了101了。实际上正确结果应该为81(80+1)。 dr1("可用数量") = dr1("可用数量") + 1 是否可用做到第一个client只有把这条语句执行完dr1("可用数量") = dr1("可用数量") + 1,其他client才能开始读写这个可用数量,其它时间都阻塞操作。 听说用存储过程可用实现,不知怎弄。
|
-- 作者:大红袍 -- 发布时间:2016/3/2 16:33:00 -- 那你就做独占编辑
http://www.foxtable.com/help/topics/3007.htm
http://www.foxtable.com/help/topics/2295.htm
|
-- 作者:huhu -- 发布时间:2016/3/2 17:02:00 -- 另外一个人不是通过FT来改数据的,是通过webservice来来改的。 |
-- 作者:大红袍 -- 发布时间:2016/3/2 17:07:00 -- 你sqlfind的时候,查到的是100,那么你修改成101,本身就没有错。就比如别人直接修改成80也一样。 |
-- 作者:大红袍 -- 发布时间:2016/3/2 17:08:00 -- 库存是不能直接修改,而是添加记录,然后统计入库、出库,相减得出的。 [此贴子已经被作者于2016/3/2 17:08:18编辑过]
|
-- 作者:huhu -- 发布时间:2016/3/2 17:24:00 -- 库存是不能直接修改,而是添加记录,然后统计入库、出库,相减得出的。 他们改的是可用数量,不是在库数量。 一开始在库数量和可用数量都是100.但是销售下单了,需要发货20,那么就会冻结着20台设备给这个订单,但此时并未发货,所有在库数量仍然是100,可用数量就是80了。另外一个销售要下单了,他一查,发现可用数量是80,要发货60,能满足要求,就冻结60台设备,这是可用数量就是20了。 是这回事。
|
-- 作者:大红袍 -- 发布时间:2016/3/2 17:31:00 -- 那就应该做一个冻结表/代发货表,通过统计得出还剩多少,那样如果出错至少能返回。
同一个资源,肯定有并发的问题,无法解决。 |
-- 作者:jspta -- 发布时间:2016/3/2 17:31:00 -- 这种时靠记录,用查询来统计的,不要用这个来做,并发问题,不是靠客户端解决的 |