多人同时访问数据库问题一问!(200分)

  • 主题发起人 主题发起人 aaab
  • 开始时间 开始时间
A

aaab

Unregistered / Unconfirmed
GUEST, unregistred user!
多人同时访问数据库(SQL Svr 2k),在用户保存时给用户返回一个序列号。供其使用
由于业务要求,该序列号要不重复、不遗漏,依次递增(每次增加一)。
该程序为两层C/S模式,客户端采用原生ADO。
请教:如何避免多个用户同时保存时,仍然能够满足上述要求?

 
如果该序列号保存在SQL Server中,那么可以在数据库中为这个字段做一个触发器。
SQL Server本身能处理同步问题。
如果该序列号不是放在数据库中,那么产生序列号的时候就要先lock,然后unlock。
同步问题比较麻烦。
 
如果你想实现98登陆2000出现每个用户保存时给用户返回一个序列号,
这样可能不行。
只有客户端安装w2k pro,server安装活动目录,为每个用户建立一个登陆名,
再在服务器上设置第一次登录后自行建立一个映射驱动器。

可以用sql server。集成2000的活动目录很多功能。
而且方便好用。
 
该序列号保存在SQL Server的一个表中
 
做一个触发器。保存数据的时候那个字段的值自动增加就行了。
同步问题SQLServer会自动处理的。
 
不重复还差不多、不遗漏就麻烦了!(想想...)
 
各位专家,能不能详细一些,最好有代码。
请各位继续支持!
 
不要代码的,只要在SQLSERVER中设置锁的级别就行了
 
在table 上作一个indentity字段就可以了,
insert 后
select @@IDENTITY
就可以返回你新增那条记录的ID号了
 
to taninsh: 如果删除纪录,你的方法就不好用了。
 
只要"序列号要不重复、不遗漏,依次递增(每次增加一)"?????
没有格式限制吗?那你用一个自增长字段就行了!
如果有,就用触发器吧
 
如果要考虑到删除后号码再利用问题,可能触发器和自增长
字段都不行。

我现在的解决方法是建立一个号码库,使用一个删除一个,删
除数据后就把该数据记录使用的号码增加进号码库,只用一个
触发器,在删除时发现记录少于多少个时就自动再按顺序生成
一些号码增加进去。
 
我也要这样的一个功能,现在的做法是:
1、先获取记录数count(*)和当前最大代码maxid;
2、如果maxid>count(*)则select id from table,然后再从1查找一个最近可用的ID;
3、此期间对table进行锁定。

这个算法效率较低,不错经测试,在一般的小系统中只有2秒左右的延时,因此尚可接受,如果
要求并发程度很高,就只有另外想办法了。
 
在每次保存事件触发的时候计算出一下个编号的值
Function ADO_AddStringID(ConnectionName:TADOConnection;TblName,IDFldName:String;StringIDLength:Word):String;
var
strID:String;
LastID:String;
tblInsert:TAdoTable;
begin
tblInsert:=TAdoTable.Create(nil);
with tblInsert do
try
if Active then Close;
Connection:=ConnectionName;
TableName:=TblName;
Open;
with tblInsert do
begin
last;
if FieldByName(IDFldName).AsString<>'' then
LastID:=FieldByName(IDFldName).AsString
else
LastID:='0';
end;

strID:=AddZeroToString(StrInc(LastID),StringIDLength);
Close;
finally
Free;
end;
Result:=strID;
end;

第次事件触发的时候
If MessageBox(handle,'是否确定要添加资料!','提示',68+MB_DEFBUTTON2)=6 then
begin
StrID:=Ado_AddStringID(Ado_Data.ADOConnection1,'ProduceData','ID',8);
If Check then
begin
If Insert_Data(StrID) then //这是添加的一个函数,成功返回True 出错返回False
begin
MessageBox(handle,'添加成功!','提示',64);
Form_Document.Data_Refresh('Select * from ProduceData Where IsDele=0 and SeeNo=0 and FormType='+IntToStr(TypeIndex),StrID);
Close;
end
else
begin
MessageBox(handle,'添加失败,请重试!','提示',64);
end;
end;
end;
 
在table 上作一个indentity字段不失为一个好办法
如果删除纪录,这个方法也没有不好的地方,
因为任何一种方法,在删除之后都要重新调整ID才能保证不遗漏,
那就也调整一下ID就达到你的要求了,哈哈!
 
如果并发的数据不是太高,即客户端<100 你可以在按下保存后返回一个id。
因为不可能有同时按下的情况(<100)。
我这里有个项目就是采用的这种方法(是金融业的,数据要求很高的)
 
后退
顶部