В одном из наших java-приложений (основанных на postgresql db) у нас есть таблица базы данных, в которой содержится список задач, которые должны быть выполнены.
В каждой строке есть блоб json для подробной информации о задаче, а также запланированное значение времени.
У нас есть несколько работников / потоков java, чьи задания заключаются в поиске задач, готовых к выполнению (на основе значения расписания), выполнении и удалении их из таблицы. Выполнение задачи может занять несколько секунд.
Проблема в том, что несколько работников могут захватить одну и ту же строку, что приведет к дублированию выполнения задачи, чего мы хотим избежать.
Один из подходов заключается в том, что при выполнении операции select
для захвата строки используйте FOR UPDATE
, чтобы заблокировать строку, предположительно не позволяя другому работнику захватить ту же строку, которая заблокирована.
Меня беспокоит этот подход: строка блокируется только при выполнении транзакции select
в БД (согласно this ), в то время как код Java фактически выполняет строку / задачу выбрана, блокировка снята, другой работник может снова ее захватить.
Могут ли некоторые пролить свет на то, сработает ли вышеуказанный подход наверняка? Спасибо!