У меня есть сценарий базы данных (я использую Oracle), в котором несколько процессов делают вставки в таблицу, и один процесс выбирает из нее. Таблица в основном используется в качестве промежуточного хранилища, в которое несколько процессов (в дальнейшем называемых Writers) записывают события журнала, и из которых один процесс (в дальнейшем называемый Reader) считывает события для дальнейшей обработки. Читатель должен прочитать все события, вставленные в таблицу.
В настоящее время это выполняется каждой вставленной записью, которой присваивается идентификатор из восходящей последовательности. Читатель периодически выбирает блок записей из таблицы, где идентификатор больше, чем самый большой идентификатор ранее прочитанного блока. Например. что-то вроде:
SELECT
*
FROM
TRANSACTION_LOG
WHERE
id > (
SELECT
last_id
FROM
READER_STATUS
);
Проблема с этим подходом состоит в том, что, поскольку писатели работают одновременно, строки не всегда вставляются в порядке в соответствии с назначенным им идентификатором, даже если они назначаются в порядке возрастания. То есть строка с id = 100 иногда записывается после записи с id = 110, потому что процесс записи строки с id = 110 начинался после процессов, записывающих запись id = 100, но выполнялся первым. Это может привести к тому, что Reader пропустит строку с id = 100, если он уже прочитал строку с id = 110.
Принудительная запись Авторов на эксклюзивную блокировку на столе решит проблему, поскольку это заставит их последовательно вставлять данные, а также Читатель будет ожидать любых ожидающих фиксаций. Это, однако, вероятно, будет не очень быстро.
Я думаю, что Читателю будет достаточно подождать, пока какой-нибудь выдающийся коммитер Writer перед прочтением. То есть, Writers могут продолжать работать одновременно, пока Reader читает, пока все авторы не закончили.
Мой вопрос такой:
Как я могу дать указание своему процессу чтения ждать каких-либо выдающихся коммитов моих процессов записи? Любые альтернативные предложения по вышеуказанной проблеме также приветствуются.