InnoDB: обновить тайм-аут блокировки для таблицы и эффективно выбрать результат - PullRequest
1 голос
/ 19 декабря 2011

У меня есть таблица InnoDB со столбцом тайм-аута блокировки.Если этот столбец равен нулю, блокировка отсутствует, в противном случае блокировка истекает в соответствии с отметкой времени в этом столбце.

Проблема, с которой я столкнулся, состоит в том, что в этой таблице много строк, и многие строки в этой таблице обрабатываются каждую минуту, но в настоящее время обработка выполняется по этой модели:

1. select rows to be processed
2. iterate over rows to be processed in Java
     a. Try to acquire a lock on row
     b. if lock acquired, process row and continue; else continue

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

Что бы вы порекомендовали?

1 Ответ

0 голосов
/ 20 декабря 2011

выберите только те строки, которые могут быть получены блокировкой, используя предложение where в вашем sql, например

where lock_timeout is null

Кроме того, я надеюсь, что если в нем несколько потоков, вы добавите мьютекс или что-то в этомцелый раздел кода.Все, начиная с выбора строк и заканчивая блокировками.

...