2011-12-28 176 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