У меня есть таблица базы данных, содержащая очередь рабочих элементов, обрабатываемых одновременно несколькими читателями, с такими требованиями:
- Каждый элемент должен обрабатываться только одним читателем.
- Если по какой-либо причине произойдет сбой считывателя, элемент должен быть возвращен в очередь для обработки другим считывателем.
Вот псевдокод возможного решения, каждый читатель сделает следующее:
1) Читать следующий элемент из очереди и хранить его где-нибудь локально.
2) НАЧАЛО СДЕЛКИ
3) Удалите элемент, чтобы другие читатели не видели его. Если удаление не удалось, это означает, что другой работник уже вытащил элемент, поэтому вернитесь к шагу 1.
4) Обработать элемент (хранится локально на шаге 1). Это может быть долго.
5) СОВЕРШЕНИЕ СООБЩЕНИЯ: удаление элемента выполнено, перейдите к шагу 1 для обработки следующего элемента
OR
6) ROLLBACK TRANSACTION (явный откат или ошибка считывателя): удаление элемента откатывается и возвращается в очередь для другого считывателя
У меня вопрос: какой самый низкий уровень изоляции я должен обеспечить, чтобы после шага 3 (удаление элемента) другие читатели не могли его увидеть? Под самым низким я подразумеваю, что хочу максимизировать параллелизм при сохранении целостности.
Примечание. Я использую SQL Server 2005, если это имеет значение (я думаю, что это не зависит от продукта, верно?)
Любые другие отзывы об этом подходе в целом приветствуются.