我正面临重复的记录问题;并发问题。我正在从数据库中检索记录:
SELECT TOP 1 certid, certiname
FROM certificate
WHERE issued = 0
AND year = 2011
检索记录后,我正在使用过程...
插入记录不同的表有多个表影响了这个原因。我还使用SQL事务影响了所有事务或者没有影响,commit
或Rollback
。在此过程中,我还要更新证书
UPDATE certificate
SET issued = 1
WHERE certid = @certid
但同一证书颁发了多项政策..
我该如何避免这个问题?
答案 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