По-моему, ты накрутил сверх меры. Всё решается куда проще.
Структура таблицы, максимально упрощённая:
CREATE TABLE tasks (
id PRIMARY KEY,
definition,
performer_id REFERENCES performer (id)
expired_at DATETIME
);
Взятие (параметры - id обработчика и id задачи):
UPDATE tasks
SET performer_id = @performer_idб
expired_at = NOW() + INTERVAL 'performing time'
WHERE ( expired_at IS NULL or expired_at < NOW() )
AND ( id = @task_id )
То есть, задачу можно взять, если её ещё никто не брал, или если время ожидания ответа на задачу истекло. И в качестве бонуса - видно, что либо задачу никто не брал, либо кто-то брал (только последний, если таких было несколько) и прогавал сроки.
performing time может либо поставляться снаружи как параметр, либо быть свойством задачи (с соотв. полем в структуре таблицы).