Вы можете заблокировать определенную таблицу (или таблицы) с помощью оператора LOCK TABLES
.
В целом, я бы сказал, что полагаться на это - плохой дизайн, и, скорее всего, это приведет к проблемам с масштабируемостью в будущем, поскольку вы создаете узкое место в потоке приложений.
С вашими дальнейшими объяснениями я бы соблазнился добавить несколько дополнительных столбцов в таблицу, используемую delayed_job, с уникальным индексом для них. Если (например) вы когда-либо хотели получить только 1 задание на пользователя, добавьте столбец user_id
, а затем выполните
something.delay(:user_id => user_id).some_method
Вам может понадобиться больше атрибутов, если шаблон более сложный, например, Есть много разных типов рабочих мест, и вы хотели только одну на человека, на тип, но принцип тот же. Вы также хотели бы быть в состоянии спасти ActiveRecord::RecordNotUnique
и изящно справиться с этим.
Для вещей, не относящихся к delayed_job, оптимистическая блокировка часто является хорошим компромиссом между хорошей обработкой параллельных случаев без замедления непоследовательных случаев.