Возвращать разблокированные строки в запросе «выберите топ n»

Мне нужна таблица базы данных MsSql и еще 8 (идентичных) процессов, которые параллельно обращаются к одной и той же таблице - выбирают top n, обрабатывают эти n строк и обновляют столбец этих строк. Проблема в том, что мне нужно выбрать и обработать каждую строку только один раз. Это означает, что если один процесс попадет в базу данных и выберет верхние n строк, то при появлении второго процесса он должен найти эти строки заблокированными и выбрать строки от n до 2 * n строк и т. Д.

можно выбрать блокировку некоторых строк при их выборе, и когда кто-то запрашивает верхние n строк, которые заблокированы, чтобы вернуть следующие строки, а не ждать заблокированных? Похоже на длинный выстрел, но ...

Еще одна вещь, о которой я подумал - может быть, не такая элегантная, но звучит просто и безопасно, - иметь в базе данных счетчик экземпляров, которые делали выборки на этой таблице. Первый поступающий экземпляр увеличивает счетчик и выбирает top n, следующий увеличивает счетчик и выбирает строки от n * (i-1) до n * i и т. Д.

Похоже ли это на хорошая идея? У вас есть предложения получше? Любая мысль высоко ценится!

Спасибо за ваше время.

6
задан Diana 3 September 2010 в 14:57
поделиться