powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / самописная таблица-очередь и select for update
25 сообщений из 60, страница 1 из 3
самописная таблица-очередь и select for update
    #39704314
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oracle 12.1
есть таблица-очередь заявок на обслуживание вида

Код: plsql
1.
2.
3.
4.
id number (id заявки, наполняем последовательно из sequence)
dt timestamp дата/время заявки
status char(1) статус заявки (Новая/Обработка/Завершена/... - хранится первая буква статуса)
+куча прочих полей, не отноcящихся к вопросу




в эту таблицу одни процессы добавляют строки со статусом Новая,
другие процессы (демоны разбора очереди, больше одного, способ реализации - Informatica или Java) должны:
- захватывать одну заявку в статусе Новая по сортировке FIFO
- менять ее статус на Обработка
- производить некую работу
- менять статус на Завершена

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

думаем в сторону select for update (nowait?) - есть ли опыт/пример/подводные камни?
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704316
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12- менять ее статус на Обработкачтобы потом маяться с определением потерянных записей и обрабатывать с пропуском очередности?
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704322
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12думаем в сторону select for update (nowait?) - есть ли опыт/пример/подводные камни?skip locked
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704324
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12вопрос: как правильно работать с таблицей очереди из демонов разбора очереди - так, чтобы
два и более одновременно работающих демона не смогли ухватиться за одну и ту же заявку?

DBMS_LOCK

Alexus12думаем в сторону select for update
Бросьте. "Тут рыбы нет."
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704438
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicAlexus12думаем в сторону select for update (nowait?) - есть ли опыт/пример/подводные камни?skip locked
С обязательным построчным фетчем курсора унутре "демона" и фиксацией транзакции по факту обновления статуса (row-by-row).
...следует обратить внимание на prefetch, который в этой модели может попортить крови при неаккуратном обращении :)
Кроме того, в табличке заданий весьма желательно помимо статуса иметь атрибуты с датой (или таймстэмпом) его (статуса) изменения, а также - неким идентификатором обработчика (должен позволять однозначно найти хост и конкретный процесс ОС) на предмет отлова "зависших" заявок и самопомерших/цинично пришибленных "демонов".
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704440
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov"Тут рыбы нет."

Есть. Но надо правильно готовить :)
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704469
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousКроме того, в табличке заданий весьма желательно помимо статуса иметь атрибуты с датой (или таймстэмпом) его (статуса) изменения, а также - неким идентификатором обработчика (должен позволять однозначно найти хост и конкретный процесс ОС) на предмет отлова "зависших" заявок и самопомерших/цинично пришибленных "демонов".
нафига? помер - откатится , завис - вычислится
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704490
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВАнафига? помер - откатится , завис - вычислится
Если обработка занимает время, то промежуточный(ные) статус(ы) "in progress" требуется для мониторинга.
А при введении таких статусов требуется решать проблему нештатно отвалившихся обработчиков ("зависших" заданий).
Отдельный сценарий - обработка на сервере приложений (возможно, кластеризованном) с пулом (пулами) коннектов, когда нельзя долго удерживать сессию БД.
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704512
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousЕсли обработка занимает время, то промежуточный(ные) статус(ы) "in progress" требуется для мониторинга.
инсерт-делит в автономке на небольшой таблице мониторинга дешевле, чем дополнительные поля и индекс на основной.
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704524
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousDВАнафига? помер - откатится , завис - вычислится
Если обработка занимает время, то промежуточный(ные) статус(ы) "in progress" требуется для мониторинга.
А при введении таких статусов требуется решать проблему нештатно отвалившихся обработчиков ("зависших" заданий).
Отдельный сценарий - обработка на сервере приложений (возможно, кластеризованном) с пулом (пулами) коннектов, когда нельзя долго удерживать сессию БД.

проблема нештатно отвалившихся обработчиков решается выборкой со skip locked не обращающей внимания на статус "in progress" )
Потому что если оно реально "in progress", то запись заблокирована обработчиком и будет пропущена, если "in progress" - наследие умершего обработчика, то возьмется снова в обработку и снова станет актуальным "in progress"
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704548
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВАесли оно реально "in progress", то запись заблокирована обработчиком и будет пропущена

Это хорошо в предположении, что обработка занимает меньше суток.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704552
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDВАесли оно реально "in progress", то запись заблокирована обработчиком и будет пропущена

Это хорошо в предположении, что обработка занимает меньше суток.

то, что занимает больше суток, в очередь как правило не выносят
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704585
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВАесли оно реально "in progress", то запись заблокирована обработчиком и будет пропущенаИ пока один проверяет in progress, другие проверяльщики и обработчики полагают отсутсвие очереди.
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704763
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot DВА]andrey_anonymousзапись заблокирована обработчиком
1. установка статуса предполагает фиксацию транзакции, т.е. обработчик должен будет блокировать строчку дважды, что усложняет логику и требует разрешения коллизий на втором раунде блокировки
2. не всякий обработчик может позволить себе удерживать сессию БД в процессе работы
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704764
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-инсерт-делит в автономке на небольшой таблице мониторинга дешевле, чем дополнительные поля и индекс на основной.
it depends...
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704861
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо всем ответившим!

дополнения:

авторС обязательным построчным фетчем курсора унутре "демона" и фиксацией транзакции по факту обновления статуса (row-by-row).


предполагается, что каждый демон разбора очереди а) получает (через select for update) всего одну строку по порядку сортировки FIFO, меняет ей статус на Обработка и комитит, после чего запускает некий внешний обработчик с ИД этой заявки

Затем происходит обработка, и обработчик последним своим писком делает апдейт статуса заявки на Завершена.

Т.о.:
- время лока строки заявки демоном - минимальное
- демон не должен лочить больше одной строки за раз


вижу на других форумах важное замечание:
автор важное отличие для работы с курсорами - курсор с for update залочит все строки попадающие под условие курсора сразу при open, а если добавить skip locked, то только те строки будут залочены, которые были действительно считаны в fetch, что позволяет: ограничить коллличество залоченых строк, или возвращать открытый курсор как результат функции с ещё не залочеными строками.

вопрос: как правильно в нашем случае отобрать и залочить всего одну строку, чтобы такого не происходило?
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704942
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хорошо подумать, то условие "всего одну строку" в подобных задачах в большинстве случаев оказывается ничем не обосновано кроме "общих соображений" ))
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704954
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12меняет ей статус на Обработка и комититНе увидел ответа на вопрос о смысле бытия.
Alexus12автор...курсор с for update залочит все строки попадающие под условие курсора сразу при open, а если добавить skip locked, то только те строки будут залочены, которые были действительно считаны в fetch...... чтобы такого не происходило?Не происходило блокировки строк for update при выполнении open и for update skip locked при выполнении fetch?
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704973
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12как правильно в нашем случае отобрать и залочить всего одну строку, чтобы такого не происходило?
1. Объявляем курсор select for update skip locked
2. Парсим, выполняем (PL/SQL: open).
3. Делаем 1 (ОДИН) фетч
4. закрываем курсор, работаем с полученной строкой

...PL/SQL: можно for-loop с безусловным exit в первой же итерации

Ахтунг1: никаких "rownum=1" и т.п. в запросе "skip locked" быть не должно

Ахтунг2: драйвер БД может использовать различные prefetch, когда вызов fetch на стороне клиента ведет к тому, что на сервере будет вычитано (и залочено), скажем, 5 или 10 строк. Поэтому для реализации подобного механизма всякие префетчи лучше отключать (driver specific).

Как-то так...
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704985
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВАЕсли хорошо подумать, то условие "всего одну строку" в подобных задачах в большинстве случаев оказывается ничем не обосновано кроме "общих соображений" ))
Ээээ... Нат, пусть у тебя в очереди 10 заданий.
И 5 обработчиков.
Первый дернул for update и заблокировал все 10 заданий.
Модель с удержанием сессии: Остальным не досталось (т.е. по факту не более одного активного обработчика в один момент времени).
Модель с коммитом: Остальные крутят холостые циклы пока первый не зафиксирует транзакцию (ненужная сериализация и избыточный поллинг).
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704989
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,


как сделать, чтобы первый схватил 1 строку - и остальным тоже досталось по строке?

демон в общем случае - процедура на pl/sql, т.е. никаких лишних прослоек между ним и базой нет
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39704997
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12andrey_anonymous,
как сделать, чтобы первый схватил 1 строку - и остальным тоже досталось по строке?
демон в общем случае - процедура на pl/sql, т.е. никаких лишних прослоек между ним и базой нет
Чукча не читатель?
21679573
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39705040
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousDВАЕсли хорошо подумать, то условие "всего одну строку" в подобных задачах в большинстве случаев оказывается ничем не обосновано кроме "общих соображений" ))
Ээээ... Нат, пусть у тебя в очереди 10 заданий.
И 5 обработчиков.
Первый дернул for update и заблокировал все 10 заданий.
Модель с удержанием сессии: Остальным не досталось (т.е. по факту не более одного активного обработчика в один момент времени).
Модель с коммитом: Остальные крутят холостые циклы пока первый не зафиксирует транзакцию (ненужная сериализация и избыточный поллинг).

Почему холостые? У меня очередь, которая постоянно пополняется и количество обработчиков подогнанное к числу минимально необходимых, для того, что бы количество записей в этой очереди было нулевым.
Первый дернул все что есть на момент его запроса из очереди и в обработку, второй и остальные то, что добавилось позже, если кому-то не достается и это происходит часто, значит у меня обработчиков сильно дохрена и их нужно сократить.
А вот за обработку по одной записи да еще в порядке очереди - поубивала бы )
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39705046
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВАПервый дернул все что есть на момент его запроса из очереди и в обработкуНе часто можно свести обработку к bulk операциям. А в oltp-системах это часто и вредно, так как увеличивается время удержания блокировки на ключевые данные.
...
Рейтинг: 0 / 0
самописная таблица-очередь и select for update
    #39705050
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВА...
А вот за обработку ... да еще в порядке очереди - поубивала бы )
Ничего, что могут быть такие задачи, события в которых обязаны обрабатываться именно в порядке их текущего расположения,
с приоритетом, назначенным им в очереди?

А вот параллелятся ли они вообще, и, если да, то как именно - это уже другой вопрос.
И, имхо, не так много шансов, что skip locked проявится в ответе на него.
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / самописная таблица-очередь и select for update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]