Данные вставляются в таблицу с нескольких серверов со скоростью 100-200 вставок / секунду. Каждый из серверов читает все строки в этой таблице в порядке идентификаторов и обрабатывает данные в потоке таймера, который выполняется каждые несколько секунд. Последний прочитанный идентификатор сохраняется в памяти и используется снова во время следующего запроса.
Что происходит, так это то, что некоторые строки не читаются функцией, считывающей данные; они пропускаются при высокой частоте вставок.
Вот сценарий.
Функция, считывающая данные, прочитала данные до идентификатора 100. Теперь она пытается прочитать строки с идентификаторами> 100. Возвращенные строки: 101,102,104,105. Строка 103 пропускается (даже если она существует).
Текущая рабочая теория того, что происходит, заключается в том, что, поскольку данные вставляются несколькими серверами, строка 103 не была зафиксирована, когда происходит чтение, поэтому не возвращается как часть набора результатов. Скорее всего, коммит происходит после прочтения. Уровень изоляции транзакции установлен на «REPEATABLE-READ».
Кто-нибудь сталкивался с чем-то подобным раньше? Как это было решено? Любые предложения приветствуются.
РЕДАКТИРОВАТЬ: Я ищу способ прочитать все строки по порядку без пробелов.