2011-12-28 5 views
0

중복 된 레코드 문제가 있습니다. 동시성 문제. 나는 데이터베이스에서 레코드를 검색 해요 :중복 기록

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

로부터 INSERT INTO 표 SELECT *를 이동

TRUNCATE 표 표 이동합니다. 나는 당신이 [테이블을 대기열로 사용하려고 시도하고있다] (http://rusanu.com/2010/03/26/using-tables-as-queues/) 모호한 생각을 가지고있다. 그러나 이것은 따르기가 어렵거나 불가능하다. . –

+0

단어는 '기록'입니다. 그것은 'recored'또는 'reocord'가 아닙니다. –

답변

1

동시 프로세스가 겹치지 않고 하나의 행을 선택하려고하는 경우 몇 가지 힌트가 필요합니다. (ROWLOCK, READPAST, UPDLOCK). 여기에 더 많은 정보 : SQL Server Process Queue Race Condition

는 sysobjects의 FROM

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

고맙습니다 친구 ... 내가 전화를 할 수있는 방법 OUTPUT INSERTED.certid, INSERTED.certiname이 변수는 항상 상위 1 레코드를 업데이트하기 때문에 내 인증서가 될 것이므로이 문장은 아무것도 업데이 트됩니다. 이유는 로컬 변수에 값을 저장하려고합니다. –

+0

@AbrarAhmad : 테이블 변수를로드 한 다음 선택하거나 조인해야합니다. – gbn

0

IF가 존재하는 OUTPUT 절 (SELECT *을 동일한 트랜잭션에서/업데이트를 선택 사용하려는 경우 유형 = 'U'와 이름 = 'Temp_Table1 ') 가고 드롭 테이블 Temp_Table1 끝을 시작 선택 * 갈 표에서 Temp_Table1에 TRUNCATE 표 Temp_Table1 이동 CREATE UNIQUE INDEX unqT ON Temp_Table1 IGNORE_DUP_KEYWITH (아이디 DESC) 6,아이디 DESC 에 의해 표 순서와 INSERT INTO Temp_Table1 SELECT * 이동이 더 나은 당신이 뭘 하려는지 설명해주십시오 Temp_Table1