我在服务器创建了以下存储过程:
/****** Create Procedure ******/
Create Procedure GetSN
@ItemFlag char(1) --票据标志
as
begin
declare @identityID int
begin tran UpdateSNSequence
  update SNSequence set @identityID=CurrSN, CurrSN=CurrSN + 1 where ItemFlag=@ItemFlag
select @identityID as CurrSN
commit tran UpdateSNSequence
end
go然后在delphi 的开发中,通过下列代码(多线程)来获取当前的流水号,并将得到的流水号登记到表:SNTable中:
begin
 try
    for iCount := 0 to 50 do
    begin
      with qryChildUpdate do
      begin
        Close;
        SQL.Clear;
        sUpdateCommand := Format('Exec GetSN ''%s''',['0']);//调用存储过程,获取流水号
        SQL.Add(sUpdateCommand);
        Open;        gsTraceString := Trim(FieldByName('CurrSN').AsString);//gsTraceString 为一个全局变量        Close;
        SQL.Clear;
        SQL.Add('begin tran insertSN' );
        ExecSQL;
        
        Close;
        SQL.Clear;
        //登记流水
        sUpdateCommand := Format('insert into SNTable values ( %s )',[gsTraceString]);
        SQL.Add(sUpdateCommand);
        ExecSQL;        Close;
        SQL.Clear;
        SQL.Add('commit tran insertSN' );
        ExecSQL;       end;
    end;
  except
    on e: exception do
    begin
      gsErrorString := e.message;
      Synchronize( procErrorAppend );
      exit;
    end;
  end;
    sleep(1000);
end;当启动200个进程来进行上述操作时,数据库正常。
但启动400个进程后,循环获取流水号到一定值后,数据库报:超时已过期!
上述操作出现锁记录。
不知道何解?如何解决此问题?各位高手,用SQL Server有没有更好的方法来生成流水号,象Oracle的Sequence?