单据号格式为A0000001 ;插入收发记录表,多人同时取最大单据号,如何避免单据号不重复??要求不重复.

解决方案 »

  1.   

    SELECT 'A'+RIGHT(10000001+ISNULL(RIGHT(MAX(编号),7),0),6) 
    FROM TABLE WITH(XLOCK,PAGLOCK)
    WHERE 编号 like 'A%')
      

  2.   

    SELECT 'A'+RIGHT(10000001+ISNULL(RIGHT(MAX(编号),7),0),7) //应该是7
    FROM TABLE WITH(XLOCK,PAGLOCK) 
    WHERE 编号 like 'A%')
      

  3.   

    另外加一个用来存储,否则你在取最大值的时候,需要对整个表进行Lock才能保证编号的唯一性,如此就大大降低了效率,本来可以并发修改和增加记录的,结果全部变成了一条线串行。
    而如果把编号放在另外一个表当中,那么就只需要在取编号的时候对该条记录做rowlock,读取完并编出新号回写完之后,释放锁。如此将减少串行的粒度,并且不会影响对表的数据更新(update).