Senior
10 aplicații de procesare preiau sarcini din baza de date. Cum preveni ca două instanțe să preia aceeași sarcină?
sobes.tech AI
Răspuns de la AI
Чтобы избежать ситуации, когда два приложения одновременно забирают одну и ту же задачу из базы данных, нужно обеспечить атомарность операции выбора и блокировки задачи. Один из распространённых подходов — использовать транзакции с блокировкой строк или обновлением статуса задачи.
Например, можно сделать так:
- В таблице задач добавить поле
status(например, "new", "processing", "done"). - При выборе задачи для обработки выполнить запрос, который атомарно обновит статус задачи с "new" на "processing" и вернёт обновлённую строку.
Пример на SQL (PostgreSQL):
UPDATE tasks
SET status = 'processing'
WHERE id = (
SELECT id FROM tasks WHERE status = 'new' LIMIT 1 FOR UPDATE SKIP LOCKED
)
RETURNING *;
Здесь FOR UPDATE SKIP LOCKED позволяет другим транзакциям пропускать уже заблокированные строки, что предотвращает двойное взятие одной задачи.
В Java можно использовать JDBC и транзакции для выполнения такого запроса. Это гарантирует, что каждая задача будет обработана ровно одним приложением-обработчиком.