使用ado控件插入数据出现的奇怪的事情。

Henry.6 2016-09-27 08:58:40
报了这样的错误“违反了 PRIMARY KEY 约束 'PK_xxx'。不能在对象 'dbo.tablename' 中插入重复键。”
为什么说奇怪呢?
1,程序已经运行有三年了,一直都没有报这样错误;
2,在别的客户服务器上运行的程序同样的代码却没出错;
3,我已经把数据从该表移出,用truncate清除数据,再导入原来的数据,没报错。
4,第二天跑程序还是报这个错误,并且不是每次插入都出现。
环境:
sql2005数据库做了镜像热备
表结构是这样,

CREATE TABLE tablename(
guid BIGINT NOT NULL,
content VARCHAR(2000),
CONSTRAINT [PK_xxx] PRIMARY KEY CLUSTERED
(
[GUID] ASC
))ON [PRIMARY]

代码如下:

TRY
SqlString := 'SELECT * FROM tablename WHERE (GUID=' + GUID + ')';
P_ADOQuery_data.Close;
P_ADOQuery_data.SQL.Text := SqlString;
P_ADOQuery_data.Open;
if P_ADOQuery_data.RecordCount<=0 then
begin
P_ADOQuery_data.Append;
P_ADOQuery_data.FieldByName('GUID').Value:=GUID;
P_ADOQuery_data.FieldByName('CONTENT').Value:=CONTENT;

P_ADOQuery_data.Post;
WriteNR(0,GUID+'|'+CONTENT );
end;
Except
On e: Exception Do
Begin
WriteNR(1, '处理 信息失败:' + e.message + '(' + SqlString + ')');

End;
End;

执行中日志这样打印的:
2016-09-25 08:01:06:004:0|5856127|信息内容12345|2016-09-25 00:41:12
2016-09-25 08:01:06:050:0|5856128|信息内容abcde|2016-09-25 00:41:12
2016-09-25 08:01:06:050:1|处理信息失败:违反了 PRIMARY KEY 约束 'PK_xxx'。不能在对象 'dbo.tablename' 中插入重复键。(SELECT * FROM tablename WHERE (GUID=5856128))
...全文
327 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Henry.6 2016-09-29
  • 打赏
  • 举报
回复
经查发现是两线程执行该函数,执行的内容一样,由于服务器性能不好,第二个执行会出现冲突。
leeky 2016-09-28
  • 打赏
  • 举报
回复
估计几乎“同时”执行了两次这个函数,某次调用没执行完,另一个调用又开始了,结果都为真,然后你知道,撞机了…… 函数调用加同步机制嘛。

16,741

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧