表数据重复

shuyunn 2013-09-04 11:46:42
在服务器上写了个存储过程,定时执行这个存储过程,偶尔情况下a表中会得到重复数据,请大家帮忙看看。
a、b表结构完全一样。
BEGIN TRAN
insert into a select * from b
if(@@error<>0)
BEGIN
ROLLBACK TRAN
RETURN
END
TRUNCATE TABLE b
if(@@error<>0)
BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRAN
...全文
102 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuyunn 2013-09-06
  • 打赏
  • 举报
回复
引用 3 楼 ap0405140 的回复:
try this,

BEGIN TRAN
  insert into a select distinct * from b
  if(@@error<>0) 
  BEGIN
      ROLLBACK TRAN
      RETURN
  END
  TRUNCATE TABLE b
  if(@@error<>0)
  BEGIN
      ROLLBACK TRAN
      RETURN
  END
COMMIT TRAN
可以肯定,b表本身不会有重复数据,A表中有一个字段记录服务器的时间,从这个时间可以看出发生故障的时间点,重复的记录前后差几秒钟,也就是说在这几秒钟,服务器表不知道发生了什么故障,导致插入a表成功,清空B表失败,且事务没有回滚,再次执行时就出现了重复数据。此处用TRUNCATE TABLE 是不是不安全?
shuyunn 2013-09-04
  • 打赏
  • 举报
回复
感谢啊,我想知道是啥原因?
--小F-- 2013-09-04
  • 打赏
  • 举报
回复
解决方法是A表中设置一个主键 然后插入的时候用语句
insert into a select * from b where not exists(select 1 from a where a.主键=b.关联字段)
唐诗三百首 2013-09-04
  • 打赏
  • 举报
回复
try this,

BEGIN TRAN
  insert into a select distinct * from b
  if(@@error<>0) 
  BEGIN
      ROLLBACK TRAN
      RETURN
  END
  TRUNCATE TABLE b
  if(@@error<>0)
  BEGIN
      ROLLBACK TRAN
      RETURN
  END
COMMIT TRAN

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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