2011-12-28 108 views
0

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

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

检索我正在使用的程序插入记录不同的表中的记录后...

上有影响的理由多个表。我也使用SQL事务处理或者影响了所有事务处理或者没有处理事务处理,commitRollback。在这个过程中我也更新证书

UPDATE certificate 
SET issued = 1 
WHERE certid = @certid 

但相同的证书颁发多个策略..

如何避免这个问题?

+0

请解释更好的你正在尝试做的。我有一个模糊的想法,你正在尝试[使用表格作为队列](http://rusanu.com/2010/03/26/using-tables-as-queues/),但这很难/不可能遵循。 – 2011-12-28 11:22:36

+0

这个词是'记录'。它不是'recored'或'reocord'。 – 2011-12-28 11:25:54

回答

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 
+0

thanx dude ...你可以告诉我如何我可以设置OUTPUT INSERTED.certid,INSERTED.certiname本地变量,因为这条语句总是更新最高1记录什么时候将是我的证书已经结束,这个声明什么都不会更新..它是我想将价值存储到本地变量的原因 – 2011-12-29 07:06:27

+0

@AbrarAhmad:您需要加载表变量,然后从中选择或加入。 – gbn 2011-12-30 09:01:15

0

IF EXISTS(SELECT * FROM系统对象WHERE类型= 'U' 和名称='Temp_Table1 “) 开始 DROP TABLE Temp_Table1 结束 去 SELECT *成Temp_Table1从表1 去 TRUNCATE TABLE Temp_Table1 去 CREATE UNIQUE INDEX ON unqT Temp_Table1(ID DESC)WITH IGNORE_DUP_KEY 去 INSERT INTO Temp_Table1 SELECT * FROM表1 ORDER BY ID DESC 去

TRUNCATE表table1 去 INSERT INTO表1 SELECT * FROM Temp_Table1