我在服务器创建了以下存储过程:
/****** 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?
/****** 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?
解决方案 »
- 关于InstallShield 的BaseRTL和BaseVCL
- 求助:怎样使DLL共享主程序的数据连接如TADOConnection?
- 大家有用过MSDE的吗?那个东东有什么优点?
- 服务器开有FTP服务,客户端怎样把文件存人指定的目录下,不通过IE,比如点击一个按纽。
- 流怎么丢了???
- 有毒邮件???
- opendialog的default的属性怎么指定?偶用.txt无效,晴举例说明一下;另外,如何把opendialog选择的路径赋予edit1?
- 如何使用已得到的函数指针,改变dll中函数参数
- delphi怎样通过连接数据库实现登录界面的跳转,求具体代码
- cxgrid lookupcombobox 使用问题,请教
- 请教fastreport的用法,包括其属性及方法?
- 哪个版本得FASTREPORT好用呀?
2、先取流水号,因为生成的流水号还要作他用。所以不能直接在数据库中登记流水号。