Вы не сказали, какой сервер базы данных используете, но есть несколько вариантов.
MySQL включает расширение INSERT
для SQL99, чтобы ограничить количество обновляемых строк. Вы можете назначить каждому работнику уникальный токен, обновить количество строк, а затем выполнить запрос, чтобы получить пакет этого работника. Марк использовал синтаксис UPDATE TOP
, но не указал сервер базы данных.
Другим вариантом является обозначение таблицы, используемой для блокировки. Не используйте ту же таблицу с данными, так как вы не хотите блокировать ее для чтения. Ваша таблица блокировки, вероятно, нуждается только в одной строке, а следующий идентификатор требует работы. Рабочий блокирует таблицу, получает текущий идентификатор, увеличивает его на любой размер пакета, обновляет таблицу и снимает блокировку. Затем он может выполнить запрос к таблице данных и извлечь зарезервированные строки. Этот параметр предполагает, что таблица данных имеет монотонно увеличивающийся идентификатор, и не очень отказоустойчива, если работник умирает или не может завершить пакет.