我学习写的一个ERP小软件,前台销售界面先调用存储过程A判断库存表里的数量是否满足本次销售,如果满足,再调用存储过程B,B执行后带回插入销售表里标识字段产生的djh,前台再用返回的djh用FOR循环语句循环调用存储过程C和D,其中D是修改库存表中的库存的。
在C/S结构下,两台或更多工作站同时工作,会不会发生当A已经判断库存数量满足时,还没调用D时,另一台工作站先行修改了库存,导致库存不足?
补充:我不想用事务控制,太麻烦!

解决方案 »

  1.   

    楼主的操作才真的是太麻烦哪,看都看不懂!
    要我做,我会这样:
    前台先检索要销售货物的库存数量是否够,如够,形成销售单,确认后到数据库中先更改库存表,再插入销售表,再将销售表中的含标识的销售清单返回到前台打印.
    多行记录可以一次更新的,只要你有一个表,上面所说的销售单就是一个表,也可以是一个临时生成的表,其中的货物编号是在前次检索时获得的.
    update a set 库存量=库存量-b.销售量 from 库存表 a inner join 销售表 b on a.货物编号=b.货物编号
    一次搞定.另外,如果是C/S结构,有并行处理,那用事务是必须的,也是基本的,否则,你等着处理烦死人的脏数据吧!
      

  2.   

    老师,存储过程A是来验证库存数量是否足够
                  B是插入销售表并带回产生的标识
                  C是用返回的标识插入销售明细表。   
                        每次B只调用一次,但本次销售有多少种货物就得调用多少次C,B对C是1对多的关系
                  D修改库存
    我在查询分析器里会写事务,但在存储过程里真不知道怎么写?
    老师帮帮我
    你说的那个临时表是怎么产生的?我的前台没有一句SQL语句,都是通过调用存储过程完成对数据库的操作
      

  3.   

    我希望能有一种方法,同时锁定库存表、销售表、销售明细表,当存储过程A、B、C、D(其中C和D是多次调用)全部执行完成后,再释放锁定的表。
    用事务怎样实现.
    在4个存储过程里都写上下面的语句,可以实现吗:
    Createp proccreate proc AA1
    as
    Begin
    BEGIN TRANSACTION
    --存储过程内容
    (
    If @@error<>0
       If @@TranCount=1
          Rollback Transaction
    )--中间出现事务每次要进行以此判断
    else
       If @@TranCount=1
          Commit TRANSACTION
    End