Такой подход, который я бы порекомендовал, заключается в том, чтобы в записи в поле было указано поле, указывающее, обрабатывается ли запись или нет. Затем реализуйте sproc «читать далее из очереди», который выполняет следующее, чтобы гарантировать, что 2 процесса не получат одну и ту же запись:
BEGIN TRANSACTION
-- Find the next available record that's not already being processed.
-- The combination of UPDLOCK and READPAST hints makes sure 2 processes don't
-- grab the same record, and that processes don't block each other.
SELECT TOP 1 @ID = ID
FROM YourTable WITH (UPDLOCK, READPAST)
WHERE BeingProcessed = 0
-- If we've found a record, set it's status to "being processed"
IF (@ID IS NOT NULL)
UPDATE YourTable SET BeingProcessed = 1 WHERE ID = @ID
COMMIT TRANSACTION
-- Finally return the record we've picked up
IF (@ID IS NOT NULL)
SELECT * FROM YourTable WHERE ID = @ID
Подробнее об этих табличных подсказках см. MSDN