起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: allentime

[结贴]流水号问题**

[复制链接]
 楼主| 发表于 2008-4-2 16:20:01 | 显示全部楼层
我们也觉得奇怪呀,概论太小了,但是确实有这样的情况出现,有日期时间字段,我查下看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-2 16:27:06 | 显示全部楼层
数据库记录的是日期没有精确到时间呢, 是在同一天录入的单子
回复 支持 反对

使用道具 举报

发表于 2008-4-2 16:31:21 | 显示全部楼层
如果没有时间,那就不好说了,因为一天的数据概率太大了。可以把你的资源传上来看看,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-2 16:54:25 | 显示全部楼层
我们每天的数据量不大,应该跟时间没什么关系,系统从2月份开始运行,到现在就出现2次同一合同号不同的客户使用的情况
回复 支持 反对

使用道具 举报

发表于 2008-4-2 18:17:58 | 显示全部楼层
这是取流水号的函数
static function TCOMMONUTILS.GetAutoIncreaseID(AContext: TContext;ACodeID, ACodeRemark: string): string;
const
  CODESCOPE = '自动递增序列';  // 通用编码表中的编码类型
  SQLText = 'SELECT * FROM TCOMMONCODE WHERE (FSCOPE = :FScope) AND (FCODE=:FCode)';
  UpdateSQLText = 'UPDATE TCOMMONCODE SET FCONTENT = :FCONTENT where (FSCOPE = :FScope) AND (FCODE=:FCode)';
  InsertSQLText = 'INSERT INTO TCOMMONCODE (FSCOPE, FCODE, FCONTENT, FDESCRIPTION) VALUES (:FScope, :FCode, :FCONTENT, :FDESCRIPTION)';
  CODEFIELD = 'FCODE';
  SCOPEFIELD = 'FSCOPE';
  CONTENTFIELD = 'FCONTENT';
  DESCRIPTIONFIELD = 'FDESCRIPTION';
var
  lQuery: Business.Data.TQuery;
begin
  lQuery := Business.Data.TQuery.Create(nil);
  with lQuery do
  try
    ConnectionString := SysUtils.Format('DATABASEURL=%s', [TRTLConsts.CollaborationDatabaseURL]);
    Close;
    CommandText := SQLText;  // 从通用编码表中取出当前编号的数据
    Params.ParamByName(SCOPEFIELD).AsString := CODESCOPE;
    Params.ParamByName(CODEFIELD).AsString := ACodeID;
    Open;
    if (not lQuery.IsEmpty) then
    begin
      Result := SysUtils.IntToStr(lQuery.FieldByName(CONTENTFIELD).ASInteger + 1);  // 设置编码的自增量
      Close;
      CommandText := UpdateSQLText;
      Params.ParamByName(CONTENTFIELD).AsString := Result;
      Params.ParamByName(SCOPEFIELD).AsString := CODESCOPE;
      Params.ParamByName(CODEFIELD).AsString := ACodeID;
      Execute;
    end else
    begin
      Result := '1';   // 设置编码的初始值
      Close;
      CommandText := InsertSQLText;
      Params.ParamByName(SCOPEFIELD).AsString := CODESCOPE;
      Params.ParamByName(CODEFIELD).AsString := ACodeID;
      Params.ParamByName(CONTENTFIELD).AsString := Result;
      Params.ParamByName(DESCRIPTIONFIELD).AsString := ACodeRemark;
      Execute;
    end;
  finally
    lQuery.Free;
  end;
end;

从代码上看,确实有可能会由于并发访问导致重号。

楼主可以用考虑存储过程来完成以上逻辑,减少这种现象发生 的几率
回复 支持 反对

使用道具 举报

发表于 2008-5-13 10:29:58 | 显示全部楼层
先结贴,有反馈请发新贴
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-12 23:18 , Processed in 0.039359 second(s), 12 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表