重复记录

时间:2011-12-28 11:19:30

标签: sql sql-server

我正面临重复的记录问题;并发问题。我正在从数据库中检索记录:

SELECT TOP 1 certid, certiname
  FROM certificate
 WHERE issued = 0
   AND year = 2011 

检索记录后,我正在使用过程...

插入记录不同的表

有多个表影响了这个原因。我还使用SQL事务影响了所有事务或者没有影响,commitRollback。在此过程中,我还要更新证书

UPDATE certificate
SET    issued = 1
WHERE  certid = @certid 

但同一证书颁发了多项政策..

我该如何避免这个问题?

2 个答案:

答案 0 :(得分:1)

如果您尝试让并发进程选择一行而不重叠,那么您需要一些提示(ROWLOCK, READPAST, UPDLOCK)。更多信息:SQL Server Process Queue Race Condition

如果要在同一事务中选择/更新,请使用OUTPUT子句

UPDATE TOP (1) certificate WITH (ROWLOCK, READPAST, UPDLOCK)
SET    issued = 1
OUTPUT INSERTED.certid, INSERTED.certiname
-- or OUTPUT INSERTED.certid, INSERTED.certiname INTO @SOmeTableVariable 
WHERE  issued = 0
   AND year = 2011 

答案 1 :(得分:0)

IF EXISTS(SELECT * FROM sysobjects WHERE type ='U'和name ='Temp_Table1') 开始 删除表Temp_Table1 结束 走 从Table1中选择*进入Temp_Table1 走 TRUNCATE TABLE Temp_Table1 走 使用IGNORE_DUP_KEY在Temp_Table1(id DESC)上创建UNIQUE INDEX unqT 走 INSERT INTO Temp_Table1 SELECT * FROM Table1 ORDER BY id DESC 去

TRUNCATE TABLE表1 走 INSERT INTO Table1 SELECT * FROM Temp_Table1