Foxtable(狐表)用户栏目专家坐堂 → [求助]存储过程


  共有4570人关注过本帖树形打印复制链接

主题:[求助]存储过程

帅哥哟,离线,有人找我吗?
huhu
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
[求助]存储过程  发帖心情 Post By: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了。
如何避免这种情况。
是用存储过来来实现吗?怎么弄?

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/2 16:17:00 [只看该作者]

 修改后,要立马保存。然后要用sqlfind查找后台最新的数据

 

 Dim dr1 As DataRow = DataTables("库存通用态表").sqlFind("物料编码 = '" & e.DataRow("物料编码") & "'")


 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By: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才能开始读写这个可用数量,其它时间都阻塞操作。
听说用存储过程可用实现,不知怎弄。

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/2 16:33:00 [只看该作者]


 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 17:02:00 [只看该作者]

另外一个人不是通过FT来改数据的,是通过webservice来来改的。

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/2 17:07:00 [只看该作者]

你sqlfind的时候,查到的是100,那么你修改成101,本身就没有错。就比如别人直接修改成80也一样。

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/2 17:08:00 [只看该作者]

库存是不能直接修改,而是添加记录,然后统计入库、出库,相减得出的。
[此贴子已经被作者于2016/3/2 17:08:18编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 17:24:00 [只看该作者]

库存是不能直接修改,而是添加记录,然后统计入库、出库,相减得出的。
他们改的是可用数量,不是在库数量。
一开始在库数量和可用数量都是100.但是销售下单了,需要发货20,那么就会冻结着20台设备给这个订单,但此时并未发货,所有在库数量仍然是100,可用数量就是80了。另外一个销售要下单了,他一查,发现可用数量是80,要发货60,能满足要求,就冻结60台设备,这是可用数量就是20了。
是这回事。

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/2 17:31:00 [只看该作者]

 那就应该做一个冻结表/代发货表,通过统计得出还剩多少,那样如果出错至少能返回。

 

 同一个资源,肯定有并发的问题,无法解决。


 回到顶部
帅哥哟,离线,有人找我吗?
jspta
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2016/3/2 17:31:00 [只看该作者]

这种时靠记录,用查询来统计的,不要用这个来做,并发问题,不是靠客户端解决的

 回到顶部
总数 37 1 2 3 4 下一页