思路有问题,按照这样的思路,要保证不重复,只能加表锁,加表锁费用太大,不提倡使用。在存储过程中定义的变量当同时调用该存储过程时,将会出现什么结果?
互相不会有影响,不必担心这个问题。重复的原因是
你用max(编号)产生新编号

解决方案 »

  1.   

    这是你的逻辑设计有问题.用max(编号)+1的方法得到新编号,为了保证并发时的编号唯一,应该提高事务隔离级别
    以保证 
      select max(编号) ...

      insert 新编号
    前无人可以再
      select max(编号) ...既然用到了事务,事务的设计原则是避免与用户交互,因此在设计上,不应该在取得编号后,由用户决定是否放弃(生成就生成了,放弃了就是空缺一个编号).
      

  2.   

    一般这样就可以了.
    CREATE PROCEDURE [Insert_BillId]
    (@货名            [varchar](10),
     @发货单位[varchar](40),
     @编号[varchar](13)output,
     @返回内容[varchar](40) output)AS
    begin tran
    select 编号=right(100000001+isnull(max(编号),0),8)
    from wzxx with(tablockx)
    where  名称  = @货名 AND 发货单位 = @发货单位
       and ([编号] ='' or [编号] is null )
    if @@rowcount=0
    begin
        set @返回内容 = '没有符合条件的数据!'
    rollback tran
    return
    end    UPDATE [aaa].[dbo].[wzxx] 
        SET  [编号] = @编号
        WHERE 名称  = @货名 AND 发货单位 = @发货单位
              and ([编号] ='' or [编号] is null )
    if @@rowcount=0 or @@error<>0
    begin
        set @返回内容 = '没有符合条件的数据!'
    rollback tran
    return
    end commit tran
    go