Использование подсказки блокировки READPAST правильное, и ваш SQL выглядит нормально.
Я бы добавил использование XLOCK, хотя это также HOLDLOCK / SERIALIZABLE
...
[MyRecords] WITH (READPAST, ROWLOCK, XLOCK)
...
Это означает, что вы получаете идентификатор и блокируете эту строку, пока вы продолжаете, и обновляете ее.
Редактировать: добавить индекс для столбцов Отправлено и Получено, чтобы ускорить его. Если [ID] (я предполагаю, что это PK) не кластеризован, ВКЛЮЧИТЕ [ID]. И фильтруйте индекс тоже, потому что это SQL 2008
Вы также можете использовать эту конструкцию, которая делает все это за один раз без XLOCK или HOLDLOCK
UPDATE
MyRecords
SET
--record the row ID
@id = [ID],
--flag doing stuff
[Dispatched] = GETDATE()
WHERE
[ID] = (SELECT TOP 1 [ID] FROM MyRecords WITH (ROWLOCK, READPAST) WHERE Dispatched IS NULL ORDER BY Received)
ОБНОВЛЕНИЕ, назначить, установить в одно