SQL의 비트에서 특정 기준과 일치하는 테이블의 다음 행을 가져와 삭제하고 싶습니다. 그러나 동일한 SQL 행을 실행하는 다른 서비스가 동일한 행을 리턴하지 못하도록하고 싶습니다. 거래 나 행 잠금에 대해 생각하고 있었지만 어느 쪽이 나를 도울 수 있는지는 알 수 없습니다. (당신이하고있는 일이다)SQL Server에서 읽기 용 행을 잠급니다?
DECLARE @tblTempRow TABLE(intUserID int, intBlobID int)
-- Get the next match and remember in temp table. I want to prevent that other processes return the same row.
INSERT INTO @tblTempRow(intUserID, intBlobID)
SELECT TOP 1 intUserID, intBlobID FROM Schedule WHERE intScheduleType = @intScheduleType
-- Delete if requested.
IF(@intDeleteAfterGet = 1)
BEGIN
DELETE FROM
Schedule
WHERE
intUserID = (SELECT intUserID FROM @tblTempRow)
AND intBlobID = (SELECT intBlobID FROM @tblTempRow)
AND intScheduleType = @intScheduleType
END
-- Return the temp table.
SELECT intUserID, @intScheduleType, intBlobID FROM @tblTempRow
READPAST 쿼리 힌트 란 무엇입니까? – Krumelur
이것은 내가 생각하는 가장 우아한 방법입니다. 고맙습니다! (btw : 귀하의 구문이 잘못되었습니다. 그것은 "DELETE TOP (1) ... WITH() ... OUTPUT ... WHERE"의 순서가되어야합니다. 또한 OUTPUT이 유효한 테이블을 생성 할 때 임시 테이블을 버릴 수도 있습니다. 결과 세트. – Krumelur
@ Krumelur - READPAST는 행이 잠겨 있으면 무시하도록 지시합니다. 따라서이 코드를 동시에 실행하는 두 개의 연결이있는 경우 "첫 번째"행을 잠그고 반환하고 두 번째 행은 무시하고 select 두 번째 연결 - 그렇지 않으면 두 번째 연결은 "두 번째"행을 가져 오기 전에 잠금 (및 후속 삭제)이 발생할 때까지 대기합니다. "ORDER BY 절이 없으므로"첫 번째 및 두 번째 따옴표가 따옴표로 묶입니다. 쿼리. –