MySQL read возвращает более поздние строки, но не более ранние - PullRequest
0 голосов
/ 20 мая 2011

Данные вставляются в таблицу с нескольких серверов со скоростью 100-200 вставок / секунду. Каждый из серверов читает все строки в этой таблице в порядке идентификаторов и обрабатывает данные в потоке таймера, который выполняется каждые несколько секунд. Последний прочитанный идентификатор сохраняется в памяти и используется снова во время следующего запроса.

Что происходит, так это то, что некоторые строки не читаются функцией, считывающей данные; они пропускаются при высокой частоте вставок.

Вот сценарий.

Функция, считывающая данные, прочитала данные до идентификатора 100. Теперь она пытается прочитать строки с идентификаторами> 100. Возвращенные строки: 101,102,104,105. Строка 103 пропускается (даже если она существует).

Текущая рабочая теория того, что происходит, заключается в том, что, поскольку данные вставляются несколькими серверами, строка 103 не была зафиксирована, когда происходит чтение, поэтому не возвращается как часть набора результатов. Скорее всего, коммит происходит после прочтения. Уровень изоляции транзакции установлен на «REPEATABLE-READ».

Кто-нибудь сталкивался с чем-то подобным раньше? Как это было решено? Любые предложения приветствуются.

РЕДАКТИРОВАТЬ: Я ищу способ прочитать все строки по порядку без пробелов.

1 Ответ

1 голос
/ 20 мая 2011

Ваше предположение почти наверняка происходит.

есть незафиксированные вставки. последовательность по-прежнему увеличивается, как только другой поток использует ее, но вы не увидите строку до фиксации.

ваш набор результатов будет согласованным по чтению с момента инициирования запроса, поэтому даже если строка зафиксирована во время возврата результатов, вы все равно не увидите ее до следующих запросов.

что вы ищете для предложения? Вы никогда не сможете прочитать незафиксированную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...